2010-10-05 50 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