Пример взаимоблокировки в Oracle
Взаимная блокировка двух сессий происходит когда сессии натыкаются на блокировку друг друга. Продемонстрировать такое поведение можно на таблице с двумя строками.
drop table test.emp;
create table test.emp
(
rid integer not null,
name varchar2(100)
);
alter table test.emp
add constraint table_pk primary key (rid);
insert into test.emp (rid, name) values (1, 'запись 1');
insert into test.emp (rid, name) values (2, 'запись 2');
commit;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Следующая последовательность запросов update приводит к взаимной блокировке.
Сессия 1 | Сессия 2 |
update test.emp set name = '11' where rid = 1; | |
update test.emp set name = '22' where rid = 2; | |
update test.emp set name = '22' where rid = 2; | |
Сеанс зависает | |
update test.emp set name = '11' where rid = 1; | |
ORA-00060: взаимная блокировка при ожидании ресурса |
Ошибка ORA-00060, как написано в документации, может появиться в случайной из этих сессий.