喜請參見上面image.I僵局圖形部分有兩筆交易是更新同一個表,其中一個是長事務是更新表(同一行)的5倍,但另一個事務只更新該表一次,並且是一個兩個數據庫命中的小事務。從邏輯上看,死鎖圖中的事實都是事務在不同行上具有X鎖並試圖獲得U鎖。我不明白爲什麼較短的事務獲得X鎖,儘管它尚未觸發更新查詢(因爲它是導致死鎖的更新查詢,這意味着它尚未被觸發)。任何幫助將非常可愛。 1)我正在使用隔離級別提交 2)我不能理解第二個/第一個事務可以如何獲得X鎖定,而另一個事務已經在某一行獲得了它。我讀到更新查詢第一個U鎖應用,然後被升級爲X鎖,用於該特定更新的行。現在,當一個事務具有X鎖,那麼另一個事務如何在表掃描期間具有U鎖(以確定要更新的行),它不能讀取具有X鎖的行其他事務。3)這兩個事務都更新同一個表的不同行。任何可能的解決方案都在DB級別上,而不會改變隔離級別。
回答
我無法理解的第二/第一筆交易如何才能獲得X鎖 而其他交易已經得到了它的一些行。
這是數據庫及其性能背後的魔力。鎖可以在不同級別上發佈,如果第二個事務沒有使用表掃描,它可以發出X鎖而不會與第一個事務衝突。在使用索引和表掃描進行搜索的情況下,更新記錄可能沒有發生,因此表中可能存在多個併發X鎖。
我讀過,在更新查詢第一個U鎖被應用,然後是 升級到特定更新行的X鎖。
否更新應直接在記錄上使用X鎖。你的讀取查詢必須強制讀取要讀取的數據(這是@Marc在他的評論中提到的)。正如你所知,EF不支持這個,因爲它不能使用提示。
非常感謝這些都是非常有用的建議。 yes iam不使用任何UPDLOCK提示。並且當我通過使用select * from sys.dm_tran_Locks看到鎖列表時,應用的鎖僅在關鍵級別爲X,在頁級別爲IX,但爲什麼在Deadlock圖中顯示事務正在等待把U鎖。 – ethicallogics
這是你必須在執行的命令中找到的東西。死鎖圖也應該顯示。 –
將IX鎖應用於更新表X鎖KeyLock應用於sys.sysconvgroup後,sys.sysdesend – ethicallogics
- 1. 事務死鎖和的DbContext
- 2. 併發事務中的死鎖
- 3. mysql事務死鎖
- 4. 事務死鎖TX
- 5. 事務死鎖SqlMembershipProvider.CreateUser()
- 6. 樹節點上的JPA併發更新導致事務死鎖
- 7. 如何防止併發事務中的數據庫死鎖?
- 8. 由事務隔離級別分隔的併發進程死鎖
- 9. SQL Server 2005:事務死鎖
- 10. 清除事務死鎖?
- 11. nhibernate事務死鎖問題
- 12. MySQL事務發生死鎖,但SHOW ENGINE INNODB STATUS不顯示真正的死鎖
- 13. 死鎖使用Spring的事務
- 14. 長事務處理的死鎖
- 15. SQL Server插入鎖與併發事務
- 16. 如何在沒有事務的情況下發生死鎖?
- 17. 在死鎖後重新提交事務
- 18. MySql:事務不檢測死鎖?
- 19. 事務(進程ID 72)被鎖死
- 20. 實體框架事務和死鎖
- 21. 死鎖和超時打破ACID事務
- 22. 事務(進程ID)被鎖死
- 23. 重新提交死鎖事務php
- 24. Oracle如何檢測事務死鎖?
- 25. 可串行化事務死鎖
- 26. Django數據庫事務和死鎖
- 27. 事務(進程ID 461)死鎖
- 28. PSQL JDBC事務導致死鎖
- 29. 調度程序在Spring事務中發生死鎖時停止
- 30. TFS合併死鎖
這裏的經典答案是:以相同的順序取鎖;這可能涉及發出一個選擇,也許與UPDLOCK。不知道這是可能的與EF雖然。 –
使用SQL事件探查器查看事務期間執行的命令。 –
是的我正在使用EF和它不可能使用鎖提示,除非我們通過ExecuteStoreCommand @Marc發送查詢。 – ethicallogics