锁分区提升并发,以及锁等待实例
生活随笔
收集整理的這篇文章主要介紹了
锁分区提升并发,以及锁等待实例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
碼字介紹
http://msdn.microsoft.com/en-us/library/ms187504(v=SQL.100).aspx
鎖分區技術對提高并發有一定幫助,但對對象操作又有了新的定義,需要DBA&開發人員在設計,維護應用中做更細致的考量.
?
鎖分區提升并發,以及鎖等待實例
?
--測試數據庫tempdb --創建測試表 create table testlkp ( id int )--step1 spid 64中執行事務insert BEGIN TRAN ttt INSERT INTO testlkp VALUES(1)
說明:創建測試環境,第一步開啟事務執行insert 成功
?
---隨意不相關session spid70中查看操作的數據庫上下文中查看鎖的情況select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode說明:觀察鎖情況發現鎖中分區號15有對象級IX鎖
?
?
--step 2新開啟session spid 67 執行sql 被阻塞ALTER TABLE testlkp ALTER COLUMN id smallint說明:由于無法獲得整體對象SCH-M鎖,等待
?
---隨意不相關session spid70中查看操作的數據庫上下文中查看鎖的情況select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode說明:其他鎖分區(0-14)均獲得了SCH-M鎖,但由于15由于IX鎖無法獲得
?
--Step3 新開啟session 執行事務 插入數據 spid 71 被阻塞BEGIN TRAN ttt INSERT INTO testlkp VALUES(2) ---------blocked說明:開啟新session查詢被阻塞
---隨意不相關session spid70中查看操作的數據庫上下文中查看鎖的情況select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode說明:insert需要申請表的IX鎖,但正好落在15這個分區上,所以等待
--Step4 新開啟session 執行事務 插入數據 spid 65 執行成功!BEGIN TRAN ttt INSERT INTO testlkp VALUES(3)說明:開啟新的session insert 插入成功!
---隨意不相關session spid70中查看操作的數據庫上下文中查看鎖的情況select request_session_id,* from sys.dm_tran_locks where resource_database_id=DB_ID()order by request_mode
說明:新的session插入操作時在其他的鎖分區上(16)獲得IX鎖所以執行成功!
?
思考:鎖分區技術的出現提高了并發,但在做表級操作如果需所有分區鎖如SCH-M將有可能對此類操作造成更"長"等待
如索引維護操作(需SCH-M鎖),一旦有長時間事務甚至孤立事務占據著分區級的某個鎖,則可能一直陷入等待狀態造成阻塞從而影響全局.
在諸如此類操作或應用設計中,大家需要全面仔細考量.
?
?
?
?
?
?
?
轉載于:https://www.cnblogs.com/shanksgao/p/3140149.html
總結
以上是生活随笔為你收集整理的锁分区提升并发,以及锁等待实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好文转发《我现在是这样编程的》
- 下一篇: 对PostgreSQL的prepared