鎖分區技術使得SQL Server可以更好地應對并發情形,但也有可能帶來負面影響,這里通過實例為大家介紹,分析由于鎖分區造成的死鎖情形.
前段時間園友@JentleWang在我的博客鎖分區提升并發,以及鎖等待實例中問及鎖分區的一些特性造成死鎖的問題,這類死鎖并不常見,我們在這里仔細分析下.不了解鎖分區技術的朋友請先看下我的鎖分區那篇實例.
Code(執行測試腳本時請注意執行順序,說明)
步驟1 創建測試數據
use tempdbgocreate table testdlk(id int identity(1,1) PRimary key,str1 char(3000))goinsert into testdlk(str1) select 'aaa'insert into testdlk(str1) select 'bbb'insert into testdlk(str1) select 'ccc'insert into testdlk(str1) select 'ddd'
步驟2 開啟 session 1 執行語句
--session 1 begin tran update testdlk set str1='ttt' where id=1---session id 55 this example---rollback tran ---manual after session 3 rollback session 1
步驟3 開啟session 2 執行語句
--session 2BEGIN TRANupdate testdlk set str1='abc' where id=2 ---update the content of id=2SELECT * FROM testdlk WITH(TABLOCKX)------ try to get X lock on the object testdlkrollback tran---session id 58 this example
步驟4 開啟session 3執行數據
--session 3BEGIN TRANupdate testdlk set str1='abc' where id=3-------update the content of id=3 SELECT * FROM testdlk WITH(TABLOCKX)--- try to get X lock on the object testdlkrollback tran---session id 59 this example
步驟5 創建腳本的session中執行語句
select request_session_id,resource_lock_partition,resource_type,object_name(resource_associated_entity_id) as object_name,request_mode,request_status from sys.dm_tran_locks where resource_database_id=2 and resource_type='OBJECT'select session_id,blocking_session_id,wait_type,resource_description from sys.dm_os_waiting_tasks where blocking_session_id is not null
步驟6 session 1中rollback
Rollback session 1--when session 1 rollback then session 3 deadlock
當session 1回滾時,session2 session 3造成死鎖,session 3犧牲.
原因分析.
通過步驟四我們可以得到相應的會話的鎖,及相關等待情況如圖1-1
新聞熱點
疑難解答