3

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

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

4

2 回答 2

3

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

因此,您的第二种形式(更广泛的交易)可以安全使用。

于 2011-05-02T15:03:23.367 回答
2

您可以使用第二个示例。

因为您在同一个事务中,所以您正在访问先前操作的信息。

隔离表示其他操作无法访问在尚未完成的事务期间已修改的数据。隔离问题发生在并发事务(同时发生多个事务)的情况下。但是您是同一事务,因此该事务可以并且将访问第一个操作的结果。

于 2011-05-02T15:03:27.320 回答