Sql server 在SQL Server中是否可以在没有相应的BEGIN TRAN的情况下提交事务?

Sql server 在SQL Server中是否可以在没有相应的BEGIN TRAN的情况下提交事务?,sql-server,transactions,commit,Sql Server,Transactions,Commit,在SQL Server中,我们有一系列存储过程,这些存储过程运行以处理从包装过程调用的数据。在这个过程结束时,它执行一个过程,该过程总结数据并将其转储到单独数据库中的表中。数据在客户查看时不断变化,因此我们使用(nolock)提示来防止表被锁定。我知道这不是最佳实践,但不幸的是我没有创建流程,我不得不接受它。我遇到的问题,正如我相信您会预料到的,是有时它会将脏数据插入汇总表中。在没有BEGIN TRAN的情况下,在执行我的过程之前,是否有方法提交我之前的过程中的新记录?另一个注意事项:我不能使用

在SQL Server中,我们有一系列存储过程,这些存储过程运行以处理从包装过程调用的数据。在这个过程结束时,它执行一个过程,该过程总结数据并将其转储到单独数据库中的表中。数据在客户查看时不断变化,因此我们使用(nolock)提示来防止表被锁定。我知道这不是最佳实践,但不幸的是我没有创建流程,我不得不接受它。我遇到的问题,正如我相信您会预料到的,是有时它会将脏数据插入汇总表中。在没有BEGIN TRAN的情况下,在执行我的过程之前,是否有方法提交我之前的过程中的新记录?另一个注意事项:我不能使用BEGIN TRAN。

我也会删除NOLOCK,因为它在这种高度并发的场景中特别危险

如果您真的不能使用BEGIN TRAN,那么我认为您只需要删除NOLOCK并让SQL Server处理这些事情,这通常是一个好主意。 集中精力在所有涉及的过程中调优SQL,使其尽可能快,并且至少将阻塞最小化


如果可以,我建议让每个存储过程使用自己的事务begintransaction和COMMIT将数据插入“中间”表中。如果你想让他们回滚任何原因,我猜你应该考虑通过一个标志,使父过程可以避免任何进一步的处理。您希望对这些语句进行良好的调整,使它们的锁定时间不会超过需要的时间,因此,正如其他人所建议的那样,请查看索引。

如果您从脏读中提取数据,而您不想将其插入另一个表中,则解决方案是停止使用nolock。如果您不希望脏读,请不要使用
nolock
。句号。使用
NoLock
不仅不是最佳做法,而且会完全损害数据的完整性,因为重复读取和脏读取是非常重要的事情。要阅读关于NoLock的所有建议,这里有一篇好文章(我有点惊讶@SeanLange在他的评论中没有链接到)。我正在读关于坏习惯的文章,谢谢!