2012-03-14 26 views
0

我在我的數據庫中有2個表。他們是項目和領域。 Item是實現樹的自引用表。這意味着在項目表中,我有ID和ParentId列。這樣,我們可以在Item表中存儲一棵樹。 字段是存儲項目的其他擴展屬性的表格。字段表有一個名爲「Item_ID」的列來引用項目表。爲什麼更新快照隔離sql server數據庫中的事務塊刪除操作?

好吧,現在我們只是想添加事務到數據庫操作。我們發現一些奇怪的行爲作爲標題。

隨着微軟問,我們運行下面的SQL,使我們的數據庫的快照隔離:

ALTER DATABASE AdventureWorks2008R2 
SET READ_COMMITTED_SNAPSHOT ON; 

ALTER DATABASE AdventureWorks2008R2 
SET ALLOW_SNAPSHOT_ISOLATION ON; 

然後我們做如下測試:

  1. 打開2測試程序

  2. 第一個程序更新項目1並在事務提交之前被阻止。

  3. 使用第二個程序試圖刪除第2項第1項與第2項無關船舶也就是說,第1項不就是項目的2

  4. 然後,我們發現第二父/子程序被第一個程序阻止。如果我們繼續第一個程序,那麼如果它沒有超時,我們第二個程序將結束。

我對這個結果感到很奇怪。因爲我認爲我可以刪除第2項,即使第1項在交易中。誰知道這是爲什麼發生?

+1

如果真的有兩個記錄之間沒有直接的關係,這聽起來像數據庫服務器執行表鎖而不是行鎖定。 – gorjusborg 2012-03-14 13:39:50

+0

@YuRDeD,我想你是對的。由於父母/孩子的關係(我承認,我不知道SQL Server鎖定策略的內部),我懷疑它必須執行表級鎖定。 – 2012-03-14 13:44:55

+0

@Pleepleus是的,我也這麼認爲。但我覺得沒有必要這樣做。我想知道是否有任何解決方案。 – Coofucoo 2012-03-15 02:48:17

回答

0

這聽起來像你沒有得到SNAPSHOT ISOLATION(因爲碰撞更新/刪除應該導致失敗,而不是最終完成)。

你沒有字面上執行ALTER DATABASE AdventureWorks2008R2... - 是嗎?

爲「AdventureWorks2008R2」需要與你的數據庫的名稱來代替......

+0

是的,當然,我更換了數據庫名稱。我認爲問題是我的項目表是一個自我參考表。 – Coofucoo 2013-08-10 05:31:29

相關問題