SQL“DELETE”语句后跟“WHERE NOT IN”语句是否可以在同一个事务中?

时间:2011-05-02 14:55:12

标签: sql sql-server commit sql-delete sqltransaction

如果我有以下SQL块(在SQL SERVER 2008 R2中):

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

我担心第二个声明不会获取第一个删除的数据。注意,返回是因为这是存储过程的一部分。我对级联删除或加入不感兴趣,我对此方法有所限制。

2 个答案:

答案 0 :(得分:3)

相同的事务/会话可以看到它的自己的更改。其他会话将不会从会话

中看到这些未提交的事务

所以你的第二个表格(一个更广泛的交易)是安全来使用。

答案 1 :(得分: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). ,但您在同一个事务中,因此该事务可以并且将访问第一个操作的结果。