Блокировка зависает (тупик?) С двумя транзакциями - PullRequest
0 голосов
/ 19 марта 2020

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 выполняется без ожидания и без ошибки тайм-аута блокировки.

...