Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 5.74 KB | None | 0 0
  1. Transakcje od Karoliny :D
  2. --LISTA 8 - Transakcje
  3. --1. Utworzyć dwie sesje użytkownika.
  4.  
  5. --2 polaczenia
  6.  
  7. --2. W sesji pierwszej spróbować wykonać UPDATE na konkretnym wierszu,w jednej z własnych tabel z PS 5,
  8. --nie zatwierdzając transakcji, a w drugiej spróbować usunąć ten sam wiersz (wiersze najlepiej identyfikować po kluczu głównym).
  9. --Co się dzieje w drugiej transakcji?
  10.  
  11. --skrypt do zadań
  12. DROP TABLE TABELA1;
  13. DROP TABLE TABELA2;
  14. CREATE TABLE TABELA1(
  15. ID NUMBER PRIMARY KEY,
  16. POLE1 VARCHAR(30),
  17. POLE2 VARCHAR(30));
  18. CREATE TABLE TABELA2(
  19. ID NUMBER PRIMARY KEY,
  20. POLE1 VARCHAR(30),
  21. POLE2 VARCHAR(30));
  22.  
  23. DECLARE
  24. l_loop NUMBER(6) :=100;
  25. BEGIN
  26. FOR i IN 1 .. l_loop LOOP
  27.   INSERT INTO TABELA1(ID, POLE1, POLE2)
  28.   VALUES(i,'POLE1 '||i, 'POLE2 '||i);
  29. END LOOP;
  30. END;
  31.  
  32. DECLARE
  33. l_loop NUMBER(6) :=100;
  34. BEGIN
  35. FOR i IN 1 .. l_loop LOOP
  36.   INSERT INTO TABELA2(ID, POLE1, POLE2)
  37.   VALUES(i,'POLE1 '||i, 'POLE2 '||i);
  38. END LOOP;
  39. END;
  40.  
  41. COMMIT;
  42.  
  43. --sesja 1
  44. UPDATE TABELA1
  45. SET POLE1 = 'EDYCJA'
  46. WHERE ID=12;
  47.  
  48. SELECT *
  49. FROM TABELA1
  50. WHERE ID=12; --dostajemy wynik
  51.  
  52. --sesja 2
  53. DELETE TABELA1
  54. WHERE ID=12;
  55.  
  56. SELECT *
  57. FROM TABELA1
  58. WHERE ID=12; --zawiesza się, oczekiwanie 2 transakcji na zatwierdzenie 1
  59.  
  60. --Chodzi o to że operacje na bazie danych wykonywane są w obrębie danej sesji, jezeli w pierwszej updateujemy coś a w drugiej usuwamy
  61. --ten sam wiersz to ta operacja zostanie wykonana ale tylko w obrębie danej sesji,
  62. --w powyższym przypadku następuje zawieszenie transakcji 2 i oczekiwanie na zatwierdzenie zmian wprowadzanych w transakcji 1
  63. --dopiero po zatwierdzeniu zmian (COMMIT) zmiany są tak naprawdę wprowadzane
  64.  
  65.  
  66. --3. W sesji pierwszej zatwierdzić transakcję czyli operację UPDATE. Co się stało w drugiej sesji?
  67.  
  68. --sesja1
  69. COMMIT;
  70.  
  71. --sesja2
  72. SELECT *
  73. FROM REZERWACJA
  74. WHERE nr_rezerwacji=12; --brak wyników
  75.  
  76. -- w sesji drugiej zostal usunięty dany wiersz, transakcja 2 oczekiwaa na wykonanie 1 po czym zostaa wykonana
  77.  
  78. --4. Powtórzyć zadanie 2 tyle, że w drugiej sesji wykonać operację dodania nowej kolumny do tabeli.
  79. --Czy dodanie nowej kolumny do tabeli jest blokowane przez UPDATE pojedynczego wiersza?
  80.  
  81. --sesja1
  82. UPDATE TABELA1
  83. SET POLE1 = 'EDYCJA - 2'
  84. WHERE ID = 1;
  85.  
  86. --sesja2
  87. ALTER TABLE TABELA1
  88. ADD POLE3 NUMBER(6);
  89.  
  90. --Tak, dodanie nowej kolumny do tabeli jest blokowane przez UPDATE pojedynczego wiersza. Transakcja 2 byla zablokowana
  91. --do momentu w którym zatwierdzono zmiany w sesji 1
  92.  
  93. --5. Powtórzyć zadanie 2. Zalogować się do bazy jako SYSUSER hasło SYSUSER.
  94. --Sprawdzić blokujące transakcje i zabić tę sesję która blokuje. Co się stanie w sesji oczekującej?
  95.  
  96. CONNECT SYSUSER/SYSUSER AS sysdba;
  97. DISCONNECT;
  98.  
  99. SELECT SID, SERIAL#, USERNAME
  100. FROM V$SESSION
  101. WHERE SID IN (SELECT BLOCKING_SESSION
  102.               FROM V$SESSION);
  103.  
  104. ALTER SYSTEM KILL SESSION 'sid,serial';
  105.  
  106. --Nie wiem czy dobrze, brak uprawnień do polaczenia.
  107. --Najprawdopodobniej sesja oczekująca zostanie wykonana
  108.  
  109. --6. W jednej sesji wybrać rekordy spełniające narzucony warunek.
  110. --W drugiej sesji dodać nowy rekord spełniający również narzucony warunek w sesji pierwszej.
  111. --W sesji pierwszej dla wybranych rekordów wykonać np. zliczanie rekordów.
  112. --Czy liczba rekordów zgadza się z liczbą pobranych w poprzednim zapytaniu?
  113.  
  114. --sesja 1
  115. SELECT COUNT(1)
  116. FROM Adres
  117. WHERE kod_pocztowy = '18-200'; --1 rekord
  118.  
  119. --sesja2
  120. INSERT INTO Adres(id_adresu,ulica,numer_budynku, kod_pocztowy, miasto)
  121. VALUES(100100, 'Ulica',101,'18-200','Biaystok');
  122.  
  123. SELECT COUNT(1)
  124. FROM Adres
  125. WHERE kod_pocztowy = '18-200'; --2 rekordy
  126.  
  127. --sesja1
  128. SELECT COUNT(1)
  129. FROM Adres
  130. WHERE kod_pocztowy = '18-200'; --1 rekord
  131.  
  132. --Chodzi o to że operacje na bazie danych wykonywane są w obrębie danej sesji
  133. --dopiero po zatwierdzeniu zmian (COMMIT) zmiany są tak naprawdę wprowadzane
  134. --dlatego liczby rekordów nie zgodzily się.
  135. --Dopiero po zatwierdzeniu transakcji 2 (dodanie rekordu) liczba wybranych rekordów w obu selectach byla taka sama
  136.  
  137. --7. W dwóch sesjach doprowadzić do zakleszczenia (deadlock) transakcji.
  138. --Czy baza sama umie poradzić sobie z taką sytuacją?
  139.  
  140. --PRZYKAD Z WYKLADU
  141. --sesja 1
  142. UPDATE EMP
  143. SET sal = 2000
  144. WHERE empno = 7934;
  145.  
  146. --sesja 2
  147. UPDATE DEPT
  148. SET loc = ‘BERLIN‘
  149. WHERE dname = ‘OPERATION‘;
  150.  
  151. --sesja 1
  152. UPDATE DEPT
  153. SET loc = ‘LONDON‘
  154. WHERE dname = ‘OPERATION‘;
  155.  
  156. --sesja 2
  157. DELETE EMP
  158. WHERE empno = 7934;
  159.  
  160.  
  161. --WLASNY PRZYKLAD
  162. --sesja 1
  163. --transakcja 1
  164. UPDATE TABELA1
  165. SET POLE1 = 'ZAKLESZCZENIE'
  166. WHERE ID = 5;
  167.  
  168. --sesja 2
  169. --transakcja 2
  170. UPDATE TABELA2
  171. SET POLE1 = 'ZAKLESZCZENIE'
  172. WHERE POLE2 = 'POLE2 2';
  173.  
  174. --sesja 1
  175. --transakcja 3
  176. UPDATE TABELA2
  177. SET POLE1 = 'ZAKLESZCZENIE'
  178. WHERE POLE2 = 'POLE2 2';
  179.  
  180. --sesja 2
  181. --transakcja 4
  182. DELETE TABELA1
  183. WHERE ID = 5;
  184.  
  185. -- w pierwszej sesji:
  186. --Error report -ORA-00060: deadlock detected while waiting for resource
  187. -- doszlo do zakleszczenia, baza danych chyba nie rozwiąże tego problemu sama
  188.  
  189. --w drugiej sesji:
  190. --transakcja oczekuje na wykonanie
  191.  
  192.  
  193. --Kolejny przyklad
  194. --Dwie transakje dokonują modyfikacji tych samych danych
  195. --tylko w odwrotnej kolejności.
  196.  
  197. --transakcja 1
  198. UPDATE EMP
  199. SET sal = 2000
  200. WHERE empno = 7934;
  201.  
  202. UPDATE EMP
  203. SET sal = 4000
  204. WHERE empno = 7933;
  205.  
  206. --transakcja 2
  207. UPDATE EMP
  208. SET sal = 4000
  209. WHERE empno = 7933;
  210.  
  211. UPDATE EMP
  212. SET sal = 2000
  213. WHERE empno = 7934;
  214.  
  215. --WLASNY PRZYKLAD
  216. --sesja 1
  217. --transakcja 1
  218. UPDATE TABELA1
  219. SET POLE1 = 'ZAKLESZCZENIE2'
  220. WHERE ID = 20;
  221.  
  222. --transakcja 2
  223. UPDATE TABELA1
  224. SET POLE1 = 'ZAKLESZCZENIE2'
  225. WHERE ID = 21;
  226.  
  227. --sesja 1
  228. --transakcja 3
  229. UPDATE TABELA1
  230. SET POLE1 = 'ZAKLESZCZENIE2'
  231. WHERE ID = 21;
  232.  
  233. --transakcja 4
  234. UPDATE TABELA1
  235. SET POLE1 = 'ZAKLESZCZENIE2'
  236. WHERE ID = 20;
  237.  
  238. -- 2 sesja ciągle oczekuje na wykonanie
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement