首页 > 解决方案 > 锁挂起(死锁?)有两个事务

问题描述

SQL Server:锁挂起(死锁?)

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 线程中运行。第二个锁应该立即返回,因为 LOCK_TIMEOUT 设置为 0,但它会永远等待。

对于甲骨文,使用

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 运行完成,没有任何等待时间,也没有锁定超时错误。

标签: sql-serverjdbclocking

解决方案


推荐阅读