Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # первое окно
- #lr6
- #1.Написать процедуру, которая добавляет связанные данные в несколько таблиц.
- #В том случае, если вставка данных в одну из таблиц по какой-либо причине невозможна,
- #выполняется откат внесенных процедурой изменений.
- SET AUTOCOMMIT=0;
- delimiter //
- create procedure task1(in id int, in _name varchar(45), in count int, in num int)
- begin
- start transaction;
- insert into склад values(id, num);
- select row_count() into @a;
- insert into товар values(id, _name, count);
- if (a > 0 ) THEN
- commit;
- else
- rollback;
- end if;
- end;
- //
- delimiter ;
- drop procedure task1;
- call task1(11, 'iPhone 11', 1, 4);
- #2
- #Написать процедуру, которая добавляет в таблицу несколько строк данных.
- #При каждом добавлении строки выполняется проверка выполнимости некоторого
- #условия на агрегированных данных одного из столбцов данной таблицы (например, сумма
- #всех значений по заданному столбцу не превышает заданного значения). При невыполнении
- #данного условия выполняется откат добавления такой строки (используя оператор ROLLBACK TO SAVEPOINT).
- delimiter //
- create procedure task2(in id1 int, in num1 int, in id2 int, in num2 int, in id3 int, in num3 int)
- begin
- declare n int;
- start transaction;
- savepoint p;
- insert into склад values(id1, num1);
- select count(idтовара) into n from склад where idтовара = id1;
- if (n > 5) then
- rollback to y;
- else
- savepoint y;
- end if;
- insert into склад values(id2, num2);
- select count(idтовара) into n from склад where idтовара = id2;
- if (n > 5) then
- rollback to y;
- else
- savepoint y;
- end if;
- insert into склад values(id3, num3);
- select count(idтовара) into n from склад where idтовара = id3;
- if (n > 5) then
- rollback to y;
- else
- commit;
- end if;
- end;
- //
- delimiter ;
- drop procedure task2;
- call task2(2, 138 ,1, 361, 4, 182);
- #3
- #Продемонстрировать возможность чтения незафиксированных изменений при использовании уровня изоляции READ UNCOMMITTED
- #и отсутствие такой возможности при уровне изоляции READ COMMITTED.
- delimiter //
- create procedure task3_1(in a int, in b int)
- begin
- start transaction;
- update товар set count = a where idтовара = b;
- do sleep(20);
- rollback;
- end;
- //
- delimiter ;
- drop procedure task3_1;
- call task3_1(1,2);
- #4
- #Продемонстрировать возможность записи в уже прочитанные данные при использовании уровня изоляции READ COMMITTED
- #и отсутствие такой возможности при уровне изоляции REPEATABLE READ. Для этого создать две процедуры, одна из процедур
- #в цикле выполняет запись в таблицу, другая – чтение данных из этой таблицы.
- delimiter //
- create procedure task4(in id1 int, in id2 int, in cnt int)
- begin
- declare _start date default '2019-01-01';
- declare _stop date default '2019-01-5';
- #set transaction isolation level read committed;
- start transaction;
- while (_start <= _stop) do
- insert into поставки values(id1, id2, _start, cnt);
- set _start = _start + 1;
- end while;
- commit;
- end;
- //
- delimiter ;
- drop procedure task4;
- call task4(5,6, 1);
- delimiter //
- create procedure task4_2(in id1 int, in id2 int, in cnt int)
- begin
- declare _start date default '2019-01-01';
- declare _stop date default '2019-01-2';
- #set transaction isolation level repeatable read;
- start transaction;
- while (_start <= _stop) do
- insert into поставки values(id1, id2, _start, cnt);
- set _start = _start + 1;
- end while;
- commit;
- end;
- //
- delimiter ;
- drop procedure task4_2;
- call task4_2(2,4, 2);
- delete from поставки where idорганизации = 2;
- select * from поставки;
- #5
- #Продемонстрировать возможность фантомного чтения при использовании уровня изоляции
- #READ COMMITTED и отсутствие такой возможности при уровне изоляции REPEATABLE READ.
- delimiter //
- create procedure task5()
- begin
- set transaction isolation level read committed;
- start transaction;
- select * from организация;
- do sleep(20);
- select * from организация;
- commit;
- end;
- //
- delimiter ;
- call task5();
- drop procedure task5;
- delimiter //
- create procedure task5_2()
- begin
- set transaction isolation level repeatable read;
- start transaction;
- select * from организация;
- do sleep(20);
- select * from организация;
- commit;
- end;
- //
- delimiter ;
- call task5_2();
- drop procedure task5_2;
- # второе окно
- delimiter //
- create procedure task3_2(in a int)
- begin
- set transaction isolation level read uncommitted;
- start transaction;
- select count from товар where idтовара = a;
- commit;
- end;
- //
- delimiter ;
- call task3_2(2);
- drop procedure task3_2;
- delete from поставки where idорганизации = 2 and idтовара = 1;
- delimiter //
- create procedure task3_3(in a int)
- begin
- set transaction isolation level read committed;
- start transaction;
- select count from товар where idтовара = a;
- commit;
- end;
- //
- delimiter ;
- call task3_3(2);
- drop procedure task3_3;
- #для read committed
- delimiter //
- create procedure task4_1()
- begin
- set transaction isolation level read committed;
- start transaction;
- select * from поставки where idорганизации = 5;
- do sleep(20);
- select * from поставки where idорганизации = 5;
- commit;
- end;
- //
- delimiter ;
- delete from поставки where idорганизации = 5;
- drop procedure task4_1;
- call task4_1();
- # для repeatable read
- delimiter //
- create procedure task4_3()
- begin
- set transaction isolation level repeatable read;
- start transaction;
- select * from поставки where idорганизации = 2;
- do sleep(20);
- select * from поставки where idорганизации = 2;
- commit;
- end;
- //
- delimiter ;
- select * from поставки;
- drop procedure task4_3;
- call task4_3();
- delimiter //
- create procedure task5_1(in id int, in _name varchar(45), in _ad varchar(45))
- begin
- start transaction;
- insert into организация values(id, _name, _ad);
- commit;
- end;
- //
- delimiter ;
- call task5_1(8, 'OOO', 'Пенза');
- delete from организация where id = 8;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement