2011-05-02 119 views
3

如果我有以下SQL塊(在SQL Server 2008 R2):SQL「DELETE」語句後跟「WHERE NOT IN」語句是否在同一事務中?

BEGIN 
    BEGIN TRAN 

    DELETE FROM dbo.fooData 
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE()) 

    COMMIT 

    BEGIN TRAN 

    DELETE FROM dbo.barData 
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub) 

    COMMIT 
    RETURN 0 
END 

我假設我必須做一個明確的語句之間COMMIT,以便從fooData被刪除的數據中顯示出來第二次刪除。它是否正確?理想情況下,我希望所有這些都在一次交易中。例如:

BEGIN 
    BEGIN TRAN 

    DELETE FROM dbo.fooData 
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE()) 

    DELETE FROM dbo.barData 
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub) 

    COMMIT 
    RETURN 0 
END 

我擔心的是第二條語句不會拿起第一條被刪除的數據。請注意,返回是因爲這是存儲過程的一部分。我對級聯刪除或加入不感興趣,我有點受限於這種方法。

回答

3

相同的交易/會話可以看到它的自己的變化。其他場次不會看到這些未提交的事務此會議

所以你的第二個形式(一個更廣泛的交易)是安全使用。

+0

感謝您的快速響應,很高興有驗證的預感。很快就會測試。 – Brian 2011-05-02 15:13:37

2

您可以使用第二個示例。

因爲您處於同一事務中,您正在訪問以前操作的信息。

隔離說,other operations cannot access data that has been modified during a transaction that has not yet completed. The question of isolation occurs in case of concurrent transactions (multiple transactions occurring at the same time).但你是int相同的事務,以便事務可以並將訪問第一個操作的結果。

+0

感謝您的深入解釋 – Brian 2011-05-02 15:13:01