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

时间:2018-07-26 16:05:47

标签: sql-server transactions commit

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

1 个答案:

答案 0 :(得分:0)

我还将删除NOLOCK,因为在这种高度并发的情况下这特别危险。

如果您真的不能使用BEGIN TRAN,那么我认为您只需要删除NOLOCK并让SQL Server来处理这些事情,无论如何这通常是个好主意。 着重于在所有涉及的过程中调整SQL,以便尽可能快地进行它,这至少会减少阻塞。

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