Пример взаимоблокировки в 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

Следующая последовательность запросов 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, как написано в документации, может появиться в случайной из этих сессий.

Ссылки

Последниее изменение: 24.08.2023, 06:42:55