sql最簡(jiǎn)單查死鎖 sql死鎖問題怎樣解決?
sql死鎖問題怎樣解決?1、首先需要判斷是哪個(gè)用戶鎖住了哪張表.查詢被鎖表 select request_session_id spid,OBJECT_NAME(resource_associat
sql死鎖問題怎樣解決?
1、首先需要判斷是哪個(gè)用戶鎖住了哪張表.查詢被鎖表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type="OBJECT"查詢后會(huì)返回一個(gè)包含spid和tableName列的表.其中spid是進(jìn)程名,tableName是表名.2.了解到了究竟是哪個(gè)進(jìn)程鎖了哪張表后,需要通過進(jìn)程找到鎖表的主機(jī).查詢主機(jī)名exec sp_who2 "xxx"xxx就是spid列的進(jìn)程,檢索后會(huì)列出很多信息,其中就包含主機(jī)名.3.通過spid列的值進(jìn)行關(guān)閉進(jìn)程.關(guān)閉進(jìn)程declare @spid intSet @spid = xxx --鎖表進(jìn)程declare @sql varchar(1000)set @sql="kill " cast(@spid as varchar)exec(@sql)PS:有些時(shí)候強(qiáng)行殺掉進(jìn)程是比較危險(xiǎn)的,所以最好可以找到執(zhí)行進(jìn)程的主機(jī),在該機(jī)器上關(guān)閉進(jìn)程.
mysql死鎖出現(xiàn)的原因?
MySQL有三種鎖的級(jí)別:頁(yè)級(jí)、表級(jí)、行級(jí)。
表級(jí)鎖:開銷小,加鎖快;不會(huì)出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。
行級(jí)鎖:開銷大,加鎖慢;會(huì)出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
頁(yè)面鎖:開銷和加鎖時(shí)間界于表鎖和行鎖之間;會(huì)出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般
所謂死鎖<DeadLock>:是指兩個(gè)或兩個(gè)以上的進(jìn)程在執(zhí)行過程中,因爭(zhēng)奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去.此時(shí)稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。表級(jí)鎖不會(huì)產(chǎn)生死鎖.所以解決死鎖主要還是針對(duì)于最常用的InnoDB。
死鎖的關(guān)鍵在于:兩個(gè)(或以上)的Session加鎖的順序不一致。
那么對(duì)應(yīng)的解決死鎖問題的關(guān)鍵就是:讓不同的session加鎖有次序
數(shù)據(jù)庫(kù)表死鎖是如何造成的?如何避免(解決)死鎖?
具體是什么情況?是不是有兩條一樣的記錄?如果是,那說明你表沒主鍵,要設(shè)置一列為主鍵就行了。當(dāng)然,必須先清表。