2010-10-05 53 views
3

在SQL Server中,这会产生多少事务?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分钟后取消,它是否需要回滚?

如果我不想在取消之后回滚一个迭代,会添加一个正在处理的事务和结束事务吗?

如果我把它放在存储过程中会有什么区别吗?

+0

存储的proc不会有任何区别。而且,正如目前所写,所有删除的行都将在单个事务中。您需要在BEGIN/END中开始/提交以限制事务范围大小,这会影响您的回滚能力。 – Joe 2010-10-05 18:28:27

+0

你为什么要设置rowlock提示?这张桌子上的聚集索引在哪里?这看起来像是应该花10分钟才能完成的事情吗? – Sage 2010-10-05 18:29:07

回答

4

如果您没有BEGIN TRANSACTIONCOMMIT,则表示隐含事务。而且,每个DELETE将是一个单独的交易。所以,如果你取消脚本,它会回滚当前的命令。但是,所有以前的DELETE步骤已经提交。

如果您在代码之前添加BEGIN TRANSACTION,然后在代码之后添加COMMIT,那么您将获得单个事务。如果您取消查询,则在没有提交或回滚的情况下,保留一个打开的事务。在这种情况下,您必须提交ROLLBACK命令来启动回滚过程。

-2

我相信这将在单个事务下执行(在这种情况下SQL Server为您创建)。你可以运行Profiler来验证这一点。把它放在存储过程中不会有什么区别。我可能会建议你为循环中的每一次传递一个Begin Tran(和相应的End Tran)。有一件事可以帮助防止你的事务日志变得太大。

2

这将是一个隐含的交易。记得ACID? SQL Server中的所有内容都是隐式或显式事务,否则您将无法保证ACID