查看被鎖表:
創(chuàng)新互聯(lián)是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十載時間我們累計服務(wù)了上千家以及全國政企客戶,如成都建筑動畫等企業(yè)單位,完善的項目管理流程,嚴(yán)格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致贊揚。
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
--spid 鎖表進程
--tableName 被鎖表名
解鎖:
declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
--查詢出死鎖的SPID
select blocked
from (select * from sysprocesses where blocked0 ) a
where not exists(select * from (select * from sysprocesses where blocked0 ) b
where a.blocked=spid)
--輸出引起死鎖的操作
DBCC INPUTBUFFER (@spid)
--查詢當(dāng)前進程數(shù)
select count(-1) from sysprocesses
where dbid in (select dbid from sysdatabases where name like '%telcount%');
減少程序中 DML(insert,update,delete) 操作所花費的時間,對此類操作做好隔離控制,防止阻塞。如果事務(wù)產(chǎn)生異常,確保事務(wù)可以正常回滾。
通常情況下,數(shù)據(jù)庫鎖表大多是因為程序設(shè)計不合理導(dǎo)致的,在寫代碼的時候,我們要對業(yè)務(wù)場景充分考慮,盡量做到以下兩點:減少程序中 DML(insert,update,delete) 操作所花費的時間,對此類操作做好隔離控制,防止阻塞。如果事務(wù)產(chǎn)生異常,確保事務(wù)可以正?;貪L。
在數(shù)據(jù)庫開發(fā)過程中,不得不考慮并發(fā)性的問題,因為很有可能當(dāng)別人正在更新表中記錄時,你又從該表中讀數(shù)據(jù),那你讀出來的數(shù)據(jù)有可能就不是你希望得到的數(shù)據(jù)??梢哉f有些數(shù)據(jù)同時只能有一個事物去更新,否則最終顯示給用戶的數(shù)據(jù)不是數(shù)據(jù)庫中現(xiàn)存的數(shù)據(jù)。鎖表就限制不同的事物在同一時間內(nèi)不允許同時操作一張表,實例很簡單,可以用select來鎖定整張表,那別人就不可能更新或是讀取表的記錄。
這個問題要具體分析:
第一,事務(wù)隔離級別基本兩種模式,一種是阻塞式(read committed,repeatable read,serializable)
,一種是非阻塞式(read uncommitted,snapshot)。
默認(rèn)是read committed,這種情況一般在更新表的時候,如果不使用hint 提示,基本是先對表添加IX鎖,級別不算高,基本和其他鎖兼容,但是repeatable read,serializable 事務(wù)隔離級別就會先對表添加IX鎖,然后向X鎖轉(zhuǎn)化,而X鎖和大多數(shù)鎖都不兼容,容易發(fā)生表阻塞。
第二種隔離級別不會有以上問題,但是又引入了其它的問題。
以上是一種情況。
另外一種就是 鎖升級,一個鎖是96B內(nèi)存,如果太多,sqlserver就會升級為表鎖,一般是5000以上行級鎖就升級為一個表X鎖。
所以適當(dāng)?shù)奈募纸M和表分區(qū) 是有必要的。
其次就是資源互相引用導(dǎo)致事務(wù)長時間不能釋放,導(dǎo)致真正的死鎖,不過SQL2005以后,這種情況發(fā)生的概率很低。
留個問題你自己去想。
兩個SQL,兩個連接,同時執(zhí)行。
update A set A.NAME=xxx where A.id=55
update A set A.NAME=xxx where A.id=56, 如果 56 不存在你說會發(fā)生什么情況呢?