如果我有以下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
我担心第二个声明不会获取第一个删除的数据。注意,返回是因为这是存储过程的一部分。我对级联删除或加入不感兴趣,我对此方法有所限制。
答案 0 :(得分:3)
相同的事务/会话可以看到它的自己的更改。其他会话将不会从此会话
中看到这些未提交的事务所以你的第二个表格(一个更广泛的交易)是安全来使用。
答案 1 :(得分:2)
您可以使用第二个示例。
因为您在同一个交易中,所以您正在访问以前操作的信息。
隔离表示 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). ,但您在同一个事务中,因此该事务可以并且将访问第一个操作的结果。