【发布时间】:2017-05-17 20:31:13
【问题描述】:
我的 Web 应用程序连接到 SQL Server 2016 Express 数据库,我们一直受到系统某些区域的数据锁的困扰。
我的同事今天注意到,当使用 KILL 进程终止一个长时间运行的事务时,几个表面上已经提交的事务被回滚了。
我在In SQL Server, how do I know what transaction mode I'm currently using? 上使用@vladV 的脚本检查了实际上数据库似乎处于自动提交模式。
因此,必须是数据库中的某些东西正在打开一个新事务而不是提交它。
于是我在数据库中找到了四个存储过程,其中包含以下内容
SET IMPLICIT_TRANSACTIONS ON
... code ...
IF @@TRAN_COUNT>0 COMMIT WORK
我是否正确地说,在某些/大多数情况下,即使在退出存储过程之后,这样的存储过程也会使事务保持打开状态,这可能是数据锁定问题的根源?
如果是这样,那么我可以通过这样做来纠正代码
SET IMPLICIT_TRANSACTIONS OFF
存储过程何时退出?
【问题讨论】:
-
可以帮助您的东西:SET IMPLICIT_TRANSACTIONS。看起来你的问题的答案是肯定的。当然,您应该对其进行测试以确定。
-
如果您使用 SQL Express,您的数据库很小,所有查询都应该非常快。也许最好优化您的长时间运行的事务以更快地运行。
-
@R.理查兹 - 好的 - 谢谢。我会尝试...
-
@MikhailLobanov - 同意!但我认为在大多数情况下它们长时间运行的原因是因为数据锁!
-
@gordon613 你也可以尝试其他事务隔离级别(例如
SNAPSHOT)。每个隔离级别都有自己的锁数
标签: sql-server