Может ли утверждение «Удалить» SQL, за которым следует заявление «где не в» быть в той же транзакции?
-
27-10-2019 - |
Вопрос
Если у меня есть следующий блок 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 -я форма (одна более широкая транзакция) Безопасно использовать.
Другие советы
Вы можете использовать второй пример.
Поскольку вы находитесь в одной и той же транзакции, вы получаете доступ к информации о предыдущих операциях.
Изоляция говорит об этом Другие операции не могут получить доступ к данным, которые были изменены во время транзакции, которая еще не завершена. Вопрос об изоляции возникает в случае одновременных транзакций (несколько транзакций происходят одновременно). Но вы - та же транзакция, так что транзакция может и будет получать доступ к результату первой работы.