Может ли оператор SQL «DELETE» следовать за оператором «WHERE NOT IN» находиться в той же транзакции? - PullRequest
3 голосов
/ 02 мая 2011

Если у меня есть следующий блок 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 ]

3 голосов
/ 02 мая 2011

В той же транзакции / сеансе можно увидеть свои изменения. Другие сеансы не увидят эти незафиксированные транзакции из этого сеанса

Таким образом, ваша вторая форма (одна более широкая транзакция) является безопасной для использования.

2 голосов
/ 02 мая 2011

Вы можете использовать второй пример.

Поскольку вы находитесь в той же транзакции, вы получаете доступ к информации о предыдущих операциях.

Изоляция говорит, что другие операции не могут получить доступ к данным, которые были изменены во время транзакции, которая еще не завершена.Вопрос об изоляции возникает в случае одновременных транзакций (несколько транзакций происходят одновременно). но вы находитесь в одной и той же транзакции, так что транзакция может и будет иметь доступ к результату первой операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...