【问题标题】:Can a SQL "DELETE" statement followed by a "WHERE NOT IN" statement be in same transaction?SQL“DELETE”语句后跟“WHERE NOT IN”语句可以在同一个事务中吗?
【发布时间】:2011-08-17 01:15:01
【问题描述】:

如果我有以下 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

我担心第二个语句不会拾取第一个删除的数据。请注意,返回是因为这是存储过程的一部分。我对级联删除或加入不感兴趣,我有点受限于这种方法。

【问题讨论】:

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


    【解决方案1】:

    同一个事务/会话可以看到它自己的变化。其他会话不会从 会话中看到这些未提交的事务

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

    【讨论】:

    • 感谢您的快速响应,很高兴必须先验证一下。很快就会进行测试。
    【解决方案2】:

    您可以使用第二个示例。

    因为你在同一个事务中,你正在访问之前操作的信息。

    Isolation 表示 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). 但您是同一事务,因此该事务可以并且将访问第一个操作的结果。

    【讨论】:

    • 感谢您的深入解释
    猜你喜欢
    • 2015-09-16
    • 2021-05-30
    • 2012-04-28
    • 2016-04-19
    • 2019-03-03
    • 1970-01-01
    • 2021-12-23
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多