是否可以让 SQL Server 在一定时间后自动回滚您的事务以避免造成阻塞/锁定?我过去曾对此感到内疚,我从许多其他人那里听说这是一个常见的错误。
例如:在进行删除/更新时,我总是使用这样的块。
BEGIN TRAN
--SQL Code Here
ROLLBACK TRAN
COMMIT TRAN
这使我可以查看有多少行受到影响或对数据执行选择,然后我可以注释掉ROLLBACK
哪个会自动COMMIT
.TRANSACTION
但是,有可能没有COMMIT
突出显示/选择导致事务挂起。我正在寻找的是一个设置,例如:
BEGIN TRAN 15 Seconds
--SQL Code Here
ROLLBACK TRAN
COMMIT TRAN
这只会使交易最多保持 15 秒的开放时间。
如果这是不可能的,有没有人有更好的工作流程?
您可以创建一个作业来检查打开的交易并在它们已经打开一段时间并导致阻塞时将其杀死。但是你必须小心这一点,因为你可能有一个大的,必要的交易,需要一段时间,你不想被杀死。想象一下,回滚在标准版上运行了一个小时的索引重建。
您可以使用sp_WhoIsActive来查找导致阻塞的打开事务,但这需要一些工作。
但我建议您不要这样做,而是在 Management Studio 中认真处理您的事务。完成后,我曾经开始交易的任何窗口都会关闭。如果其中还有一个打开的事务,SSMS 会警告我,以便我可以提交/回滚。
我不喜欢让事情碰运气,所以这样的事情意味着你总是提交或回滚。
如果它仅用于您的 SSMS 会话窗口,您可以执行以下操作:
这可能不是一个很好的解决方案。您仍然必须记住突出显示它,它可能会回滚您想要保留的修改。
我确实发现我可以稍微改变我的工作流程,这似乎有一些优点,可能会更好地吸引一些人。您可以使用此基础来代替注释掉代码的一部分。
工作流程将是,而不是注释掉 ,而是在语句上方
ROLLBACK TRAN
添加COMMIT TRAN
右侧。IF
虽然如果你不加高代码它仍然不能解决问题。