:: Не фоксом единым
Oracle продолжение
PaulWist
Автор

Сообщений: 14618
Дата регистрации: 01.04.2004
2 pasha_usue

Можем продолжить здесь. Что нужно? Код примера?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Oracle продолжение
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
PaulWist
2 pasha_usue
Можем продолжить здесь. Что нужно? Код примера?
Я примерно помню. Для этого бизнес-приложения я бы попробовал уровень изоляции serializable, без установки блокировок. Поменяем дэдлоки на ролбэки, а последние можно рулить уже на клиентах.
Ratings: 0 negative/0 positive
Re: Oracle продолжение
PaulWist
Автор

Сообщений: 14618
Дата регистрации: 01.04.2004
pasha_usue
PaulWist
2 pasha_usue
Можем продолжить здесь. Что нужно? Код примера?
Я примерно помню. Для этого бизнес-приложения я бы попробовал уровень изоляции serializable, без установки блокировок. Поменяем дэдлоки на ролбэки, а последние можно рулить уже на клиентах.

Не поможет

-- Создание таблички
create table test (ID number(10,0) primary key, f1 nvarchar2(10));
insert into test values (1, '1');
insert into test values (2, '2');
select * from test;
-- Ставим TIL
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
-- Изменяем вторую запись
update test set f1 = '22' where id = 2;

Переходим во второе соединение
select * from test for update;

-- В первом соединении обновляем первую запись
update test set f1 = '11' where id = 1;

Во втором, получаем
Цитата:
ORA-00060: взаимная блокировка при ожидании ресурса
00060. 00000 - "deadlock detected while waiting for resource"
*Cause: Transactions deadlocked one another while waiting for resources.
*Action: Look at the trace file to see the transactions and resources
involved. Retry if necessary.

-- Чистим за собой
drop table test;

SERIALIZABLE от READ COMMITTED при Update/For Update отличаются только тем, что Update/For Update накладывает и удерживает X блокировку на строку до конца транзакции, а SERIALIZABLE накладывает и удерживает RowX (RangeX) блокировку (блокировка диапазона) до конца транзакции, а поскольку в примере диапазона нет, то SERIALIZABLE ведёт себя как READ COMMITTED (почти ).


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 06.04.22 10:13
Ratings: 0 negative/0 positive
Re: Oracle продолжение
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
И занафига так делать?
Ratings: 0 negative/0 positive
Re: Oracle продолжение
PaulWist
Автор

Сообщений: 14618
Дата регистрации: 01.04.2004
pasha_usue
И занафига так делать?

Ну я же говорил.

В первой транзакции с твоего счета снимается 100р и переводится на другой счет - счет мобильного оператора, между первой и второй командой update банк решил начислить тебе проценты на счёт в конце месяца, или пример склада, с одного склада перекладывают 100 шт на другой склад, в этот момент оптовик пытается забрать всё со всех складов.

Пример жизненный-рабочий, другое дело, что большинство из нас никогда с этим не встречались, поэтому кажется, что он высосан из пальца.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Oracle продолжение
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
--Tr1
BEGIN;
UPDATE T1 SET Summa = (SELECT SUM(Val) FROM T2);
--Tr2
BEGIN;
UPDATE T2 Set Val = 1 WHERE Id = 1;
--Tr2
COMMIT;
--Tr1
COMMIT;
Tr2 падает в Exception без дополнительных блокировок в Pg и Oracle. В MySQL T2 стоит в блокировке до завершения T1. В MsSQL в зависимости от режима, но надо почитать.



Исправлено 2 раз(а). Последнее : pasha_usue, 06.04.22 11:09
Ratings: 0 negative/0 positive
Re: Oracle продолжение
PaulWist
Автор

Сообщений: 14618
Дата регистрации: 01.04.2004
pasha_usue
--Tr1
BEGIN;
UPDATE T1 SET Summa = (SELECT SUM(Val) FROM T2);
--Tr2
BEGIN;
UPDATE T2 Set Val = 1 WHERE Id = 1;
--Tr2
COMMIT;
--Tr1
COMMIT;
Tr2 падает в Exception без дополнительных блокировок в Pg и Oracle. В MySQL T2 стоит в блокировке до завершения T1. В MsSQL в зависимости от режима, но надо почитать.

Для Pg и Oracle какая ошибка? и при каком TIL? DDL табличек тоже нужно.

Если в примере 2 "вложенные" транзакции, то:

MySQL ждёт - так и должно быть, пока первая Tr не завершилась, вторая ждёт. .

Для MSSQL тоже не вижу проблем, вторая транзакция будет ждать первую, те

Tr1 на T1 установила X блокировку на все записи таблицы (эскалацию блокировок пока не рассматриваем).

Дальше уже не важно, когда вклинивается транзакция Tr2, поскольку она будет ждать снятия X блокировки с таблицы Т1, а это случится только при втором COMMIT, опять же если рассматриваем Heap-таблицы.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 06.04.22 12:20
Ratings: 0 negative/0 positive
Re: Oracle продолжение
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Гоню. Этот сценарий не нарушает логической целостности. Ни при последовательном исполнении транзакций, ни в сценарии конкуренции.

А так, "could not serialize access due to concurrent update".



Исправлено 1 раз(а). Последнее : pasha_usue, 06.04.22 12:37
Ratings: 0 negative/0 positive
Re: Oracle продолжение
PaulWist
Автор

Сообщений: 14618
Дата регистрации: 01.04.2004
pasha_usue

А так, "could not serialize access due to concurrent update".

Кстати, данное сообщение говорит о том, что выставлен TIL SNAPSHOT.

И вообще, Oracle "пожинает плоды" версионника, те он не умеет выставлять TIL SERIALIZABLE, по факту получается TIL SNAPSHOT.

Статья на "пальцах" объясняет такое поведение. blog-dbi--services-com.translate.goog


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 11 (Гостей: 11)

© 2000-2024 Fox Club 
Яндекс.Метрика