Может ли утверждение «Удалить» SQL, за которым следует заявление «где не в» быть в той же транзакции?

StackOverflow https://stackoverflow.com/questions/5858685

Вопрос

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

Я предполагаю, что я должен провести явное совершение между утверждениями, чтобы удаленные данные из 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 -я форма (одна более широкая транзакция) Безопасно использовать.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top