Sql事务提交后不释放锁
Sql Transaction doesn't release lock after commit
我在 SSMS 查询 window 中有一个类似于下面脚本的脚本 运行。脚本 运行 成功后,一些锁仍保留在受影响的表上。当我尝试关闭 window 时,会显示一个消息框,询问我是要提交还是取消事务。
我选择其中一个选项后,锁定被释放。
什么会导致这种行为?
begin tran
delete from tableA
delete from tableB
insert into tableB
insert into tableA
commit tran
我已连接到远程 Sql 服务器 2014 和 运行 本地 SSMS 2014
谢谢!
以下示例说明了如何由于未完成的打开事务而未释放锁:
打开 SQL 服务器查询分析器和 运行 以下批处理但在完成之前取消事务:
Begin Tran
Update authors set state = 'CA'
waitfor delay "00:02:00" --Cancel the command
Commit Tran
通过执行以下命令查看持有的锁:
sp_lock
您看到为作者 table 持有锁。
从相同的服务器进程 ID (SPID),执行下一批:
Begin Tran
Update titleauthor set au_ord = 0
Commit Tran - Completed transaction.
通过执行以下命令查看持有的锁:
sp_lock
您看到尽管最后一个事务已完成,但作者和标题作者 table 都持有锁。原因是第一个事务没有完成,当从同一个连接执行第二个事务时,它被视为嵌套事务。
您可以通过发出以下语句检查@@trancount 全局变量来查看事务计数:
select @@trancount
本次查询returns1,表示有一笔交易未完成。
从此连接执行的任何其他事务都被视为嵌套。锁会继续累积,直到执行 ROLLBACK 才会释放,这会回滚到最外层的事务或保存点。
继续该示例,您可以看到回滚如何通过从同一连接执行以下事务来导致已完成的事务被否定:
Begin Tran
Update titles set royalty = 0
Rollback
回滚将批次回滚到最外层的事务,即使 titleauthors 上有一个已完成的事务 (2)。已完成事务回滚是因为已完成事务被视为嵌套事务。
为避免此类问题,请在每次交易后使用以下语句检查交易是否完成:
If @@trancount > 0 rollback
参考:Incomplete transaction may hold large number of locks and cause blocking
我在 SSMS 查询 window 中有一个类似于下面脚本的脚本 运行。脚本 运行 成功后,一些锁仍保留在受影响的表上。当我尝试关闭 window 时,会显示一个消息框,询问我是要提交还是取消事务。
我选择其中一个选项后,锁定被释放。 什么会导致这种行为?
begin tran
delete from tableA
delete from tableB
insert into tableB
insert into tableA
commit tran
我已连接到远程 Sql 服务器 2014 和 运行 本地 SSMS 2014
谢谢!
以下示例说明了如何由于未完成的打开事务而未释放锁: 打开 SQL 服务器查询分析器和 运行 以下批处理但在完成之前取消事务:
Begin Tran
Update authors set state = 'CA'
waitfor delay "00:02:00" --Cancel the command
Commit Tran
通过执行以下命令查看持有的锁:
sp_lock
您看到为作者 table 持有锁。
从相同的服务器进程 ID (SPID),执行下一批:
Begin Tran
Update titleauthor set au_ord = 0
Commit Tran - Completed transaction.
通过执行以下命令查看持有的锁:
sp_lock
您看到尽管最后一个事务已完成,但作者和标题作者 table 都持有锁。原因是第一个事务没有完成,当从同一个连接执行第二个事务时,它被视为嵌套事务。
您可以通过发出以下语句检查@@trancount 全局变量来查看事务计数:
select @@trancount
本次查询returns1,表示有一笔交易未完成。
从此连接执行的任何其他事务都被视为嵌套。锁会继续累积,直到执行 ROLLBACK 才会释放,这会回滚到最外层的事务或保存点。 继续该示例,您可以看到回滚如何通过从同一连接执行以下事务来导致已完成的事务被否定:
Begin Tran
Update titles set royalty = 0
Rollback
回滚将批次回滚到最外层的事务,即使 titleauthors 上有一个已完成的事务 (2)。已完成事务回滚是因为已完成事务被视为嵌套事务。
为避免此类问题,请在每次交易后使用以下语句检查交易是否完成:
If @@trancount > 0 rollback
参考:Incomplete transaction may hold large number of locks and cause blocking