sql-server - 锁挂起(死锁?)有两个事务
问题描述
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 运行完成,没有任何等待时间,也没有锁定超时错误。
解决方案
推荐阅读
- java - 你能在其他条件语句中使用条件语句吗?
- c# - NoTextEdit ShapeLock 不工作 - OpenXML SDK
- babeljs - 如何从@babel/template 中移除环绕 IIFE?
- code-coverage - 将静态库与 Squish Coco + Scons + Visual Studio 链接时未解析的外部符号
- android - RxJava“java.lang.AssertionError:位置 0 的值不同;预期”的 Roboelectric 测试用例失败
- angular - 角材料表不渲染数据
- excel - Excel VBA - 为整个单元格范围运行的宏
- json - 如何将mongodb数据解码为结构
- karate - 空手道检查 xml 请求是否包含特定值
- rasa-nlu - 如何在 RASA 聊天机器人中添加按钮?