Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.25 KB | None | 0 0
  1. # первое окно
  2. #lr6
  3. #1.Написать процедуру, которая добавляет связанные данные в несколько таблиц.
  4. #В том случае, если вставка данных в одну из таблиц по какой-либо причине невозможна,
  5. #выполняется откат внесенных процедурой изменений.
  6. SET AUTOCOMMIT=0;
  7.  
  8. delimiter //
  9. create procedure task1(in id int, in _name varchar(45), in count int, in num int)
  10. begin
  11. start transaction;
  12. insert into склад values(id, num);
  13. select row_count() into @a;
  14. insert into товар values(id, _name, count);
  15. if (a > 0 ) THEN
  16. commit;
  17. else
  18. rollback;
  19. end if;
  20. end;
  21. //
  22.  
  23. delimiter ;
  24.  
  25. drop procedure task1;
  26. call task1(11, 'iPhone 11', 1, 4);
  27.  
  28. #2
  29. #Написать процедуру, которая добавляет в таблицу несколько строк данных.
  30. #При каждом добавлении строки выполняется проверка выполнимости некоторого
  31. #условия на агрегированных данных одного из столбцов данной таблицы (например, сумма
  32. #всех значений по заданному столбцу не превышает заданного значения). При невыполнении
  33. #данного условия выполняется откат добавления такой строки (используя оператор ROLLBACK TO SAVEPOINT).
  34.  
  35. delimiter //
  36.  
  37. create procedure task2(in id1 int, in num1 int, in id2 int, in num2 int, in id3 int, in num3 int)
  38. begin
  39. declare n int;
  40. start transaction;
  41. savepoint p;
  42. insert into склад values(id1, num1);
  43. select count(idтовара) into n from склад where idтовара = id1;
  44. if (n > 5) then
  45. rollback to y;
  46. else
  47. savepoint y;
  48. end if;
  49. insert into склад values(id2, num2);
  50. select count(idтовара) into n from склад where idтовара = id2;
  51. if (n > 5) then
  52. rollback to y;
  53. else
  54. savepoint y;
  55. end if;
  56. insert into склад values(id3, num3);
  57. select count(idтовара) into n from склад where idтовара = id3;
  58. if (n > 5) then
  59. rollback to y;
  60. else
  61. commit;
  62. end if;
  63. end;
  64. //
  65. delimiter ;
  66. drop procedure task2;
  67.  
  68. call task2(2, 138 ,1, 361, 4, 182);
  69.  
  70. #3
  71. #Продемонстрировать возможность чтения незафиксированных изменений при использовании уровня изоляции READ UNCOMMITTED
  72. #и отсутствие такой возможности при уровне изоляции READ COMMITTED.
  73. delimiter //
  74. create procedure task3_1(in a int, in b int)
  75. begin
  76. start transaction;
  77. update товар set count = a where idтовара = b;
  78. do sleep(20);
  79. rollback;
  80. end;
  81. //
  82. delimiter ;
  83.  
  84. drop procedure task3_1;
  85.  
  86. call task3_1(1,2);
  87.  
  88. #4
  89. #Продемонстрировать возможность записи в уже прочитанные данные при использовании уровня изоляции READ COMMITTED
  90. #и отсутствие такой возможности при уровне изоляции REPEATABLE READ. Для этого создать две процедуры, одна из процедур
  91. #в цикле выполняет запись в таблицу, другая – чтение данных из этой таблицы.
  92. delimiter //
  93.  
  94. create procedure task4(in id1 int, in id2 int, in cnt int)
  95. begin
  96. declare _start date default '2019-01-01';
  97. declare _stop date default '2019-01-5';
  98. #set transaction isolation level read committed;
  99. start transaction;
  100. while (_start <= _stop) do
  101. insert into поставки values(id1, id2, _start, cnt);
  102. set _start = _start + 1;
  103. end while;
  104. commit;
  105. end;
  106. //
  107.  
  108. delimiter ;
  109.  
  110. drop procedure task4;
  111. call task4(5,6, 1);
  112.  
  113. delimiter //
  114. create procedure task4_2(in id1 int, in id2 int, in cnt int)
  115. begin
  116. declare _start date default '2019-01-01';
  117. declare _stop date default '2019-01-2';
  118. #set transaction isolation level repeatable read;
  119. start transaction;
  120. while (_start <= _stop) do
  121. insert into поставки values(id1, id2, _start, cnt);
  122. set _start = _start + 1;
  123. end while;
  124. commit;
  125. end;
  126. //
  127.  
  128. delimiter ;
  129. drop procedure task4_2;
  130.  
  131. call task4_2(2,4, 2);
  132. delete from поставки where idорганизации = 2;
  133. select * from поставки;
  134.  
  135.  
  136. #5
  137. #Продемонстрировать возможность фантомного чтения при использовании уровня изоляции
  138. #READ COMMITTED и отсутствие такой возможности при уровне изоляции REPEATABLE READ.
  139. delimiter //
  140. create procedure task5()
  141. begin
  142. set transaction isolation level read committed;
  143. start transaction;
  144. select * from организация;
  145. do sleep(20);
  146. select * from организация;
  147. commit;
  148. end;
  149. //
  150. delimiter ;
  151. call task5();
  152. drop procedure task5;
  153.  
  154. delimiter //
  155. create procedure task5_2()
  156. begin
  157. set transaction isolation level repeatable read;
  158. start transaction;
  159. select * from организация;
  160. do sleep(20);
  161. select * from организация;
  162. commit;
  163. end;
  164. //
  165. delimiter ;
  166. call task5_2();
  167. drop procedure task5_2;
  168.  
  169. # второе окно
  170. delimiter //
  171. create procedure task3_2(in a int)
  172. begin
  173. set transaction isolation level read uncommitted;
  174. start transaction;
  175. select count from товар where idтовара = a;
  176. commit;
  177. end;
  178. //
  179. delimiter ;
  180. call task3_2(2);
  181. drop procedure task3_2;
  182.  
  183. delete from поставки where idорганизации = 2 and idтовара = 1;
  184.  
  185. delimiter //
  186. create procedure task3_3(in a int)
  187. begin
  188. set transaction isolation level read committed;
  189. start transaction;
  190. select count from товар where idтовара = a;
  191. commit;
  192. end;
  193. //
  194. delimiter ;
  195. call task3_3(2);
  196. drop procedure task3_3;
  197.  
  198. #для read committed
  199. delimiter //
  200. create procedure task4_1()
  201. begin
  202. set transaction isolation level read committed;
  203. start transaction;
  204. select * from поставки where idорганизации = 5;
  205. do sleep(20);
  206. select * from поставки where idорганизации = 5;
  207. commit;
  208. end;
  209. //
  210. delimiter ;
  211. delete from поставки where idорганизации = 5;
  212. drop procedure task4_1;
  213. call task4_1();
  214.  
  215. # для repeatable read
  216. delimiter //
  217. create procedure task4_3()
  218. begin
  219. set transaction isolation level repeatable read;
  220. start transaction;
  221. select * from поставки where idорганизации = 2;
  222. do sleep(20);
  223. select * from поставки where idорганизации = 2;
  224. commit;
  225. end;
  226. //
  227. delimiter ;
  228.  
  229. select * from поставки;
  230. drop procedure task4_3;
  231. call task4_3();
  232.  
  233. delimiter //
  234. create procedure task5_1(in id int, in _name varchar(45), in _ad varchar(45))
  235. begin
  236. start transaction;
  237. insert into организация values(id, _name, _ad);
  238. commit;
  239. end;
  240. //
  241. delimiter ;
  242. call task5_1(8, 'OOO', 'Пенза');
  243. delete from организация where id = 8;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement