SQL Server:事务如何工作

3
在SQL Server中,这将产生多少个事务?
DECLARE @deleted BIGINT
SET @deleted = 100000
WHILE @deleted = 100000
BEGIN
DELETE TOP(100000) FROM MYTABLE WITH (ROWLOCK)
where Col1 = 7048 and COL2 = 39727 and Col3 = 0
SET @deleted = (SELECT @@ROWCOUNT)
END

如果我在运行10分钟后取消,它是否需要回滚?

如果我不想在取消后回滚超过一次迭代,添加一个开始事务和结束事务会解决这个问题吗?

如果我将其放入存储过程中,是否会有任何区别?


存储过程不会有任何区别。而且,按照当前的写法,所有删除的行都将在单个事务中处理。您需要在BEGIN / END内部使用begin/commit来限制事务范围大小,这将影响您的回滚能力。 - Joe
你为什么要设置行锁提示?这个表上的聚集索引在哪里?这似乎是应该在10分钟内完成的任务吗? - Sage
3个回答

4
当你没有使用BEGIN TRANSACTIONCOMMIT时,你就有了隐式事务。每个DELETE将成为一个单独的事务。所以,如果你取消脚本,它将回滚当前命令。但是,所有之前的DELETE步骤已经提交。
如果在你的代码之前添加BEGIN TRANSACTION,并在你的代码之后添加COMMIT,那么你就会得到一个单一的事务。如果你取消查询,你将留下一个未提交或回滚的未完成事务。在这种情况下,你必须提交一个ROLLBACK命令来开始回滚进程。

2

这将是一笔隐式交易。记住ACID吗?在SQL Server中,所有的事务都是隐式或显式的,否则你就无法保证ACID。


-2

我相信这将在单个事务下执行(在这种情况下,SQL Server会为您创建)。您可以运行Profiler来验证此操作。将其放入存储过程中不会有任何区别。我建议您为每次循环通过添加Begin Tran(和相应的End Tran)来实现。其中一件事情是这将有助于防止事务日志变得太大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接