2016-06-22 44 views
0

工作,我有兩個表: 表A的列id(UNIQUEIDENTIFIER)name(NVARCHAR)(使用NEWSEQUENTIALID()自動生成的「ID」列中的值)READUNCOMMITTED不能跨交易

表B的列id(IDENTITY)parentId(UNIQUEIDENTIFIER)。 TableB中的 parentId在TableA id上具有外鍵約束。

我嘗試執行以下查詢:

在會議1:

BEGIN TRAN test1 INSERT INTO dbo.TableA(name) OUTPUT INSERTED.id VALUES ('foo')

注意,我不想在這裏提交事務呢。

在會議2: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRANSACTION test2 INSERT INTO dbo.TableB(parentId) VALUES('<use_id_from_session1_here>')

第二插入執行失敗,並在SQL Server Management Studio中,在我的應用程序代碼,以及掛斷。 不應該設置'ReadUncommitted'隔離級別允許第二個事務中的插入讀取第一個中未提交的內容?

我在這裏丟失了什麼或我使用的方式/設置事務隔離級別不正確?

任何建議,將不勝感激。

回答

2

發生什麼事情是當你在做第二次插入時,SQL Server試圖檢查外鍵以確保你沒有插入你不能插入的東西。但是由於TableA上的鎖定仍然由您的第一筆交易持有,您的第二筆交易正在等待。讀取未提交併不重要。在進行插入之前必須檢查約束條件,因此它將等待第一個事務完成。如果由於第一個事務尚未提交而導致鎖定不到位,您仍然會違反外鍵約束。

+0

這是非常有意義的!是否有無論如何我可以解決這個可能保持外鍵約束仍然存在? – user3638992

+0

你究竟想要做什麼?爲什麼?這將幫助我理解你可能做什麼。 –

+1

沒有辦法解決這個問題,因爲如果有辦法可能會違反參照完整性。您的設計出現瑕疵@ user3638992。交叉訪問相同的數據是非常危險和脆弱的。 – usr

0

你可能會提交會話1中的每一個插入,或者每個批次的大小不會限制會話2的等待時間