SQL Сервер: блокировка зависает (тупик?)
get JDBC connection
start transaction T1
select 1 from Foo WITH (UPDLOCK) where id=1;
try {
get another JDBC connection
start transaction T2
SET LOCK_TIMEOUT 0
select 1 from Foo WITH (UPDLOCK) where id=1; <------------ hang, wait forever
commit transaction T2
} catch (Exception e) {
rollback T2
}
Все приведенные выше операторы выполняются в одном потоке Java. 2-ая блокировка должна немедленно вернуться, потому что LOCK_TIMEOUT установлен в 0, но он ждет вечно.
Для oracle, используя
select ... for update
Код работает как ожидалось.
Пробная SSMS:
Запрос 1: соединение 1
use my_db;
create table Foo (id int, name nvarchar(30));
insert into Foo (id, name) values (1, 'A'), (2,'B');
begin transaction
select 1 from Foo with (UPDLOCK) where id=1;
Запрос 2: соединение 2
use my_db;
begin transaction
set LOCK_TIMEOUT 60000;
select 1 from Foo with (UPDLOCK) where id=1;
commit transaction;
Запустите query1, затем запустите query2. Выполнение Query2 выполняется без ожидания и без ошибки тайм-аута блокировки.