


sql server死鎖的精辟解釋
sysprocesses
sysprocesses 表中保存關(guān)于運(yùn)行在 Microsoft® SQL Server™ 上的進(jìn)程的信息。這些進(jìn)程可以是客戶端進(jìn)程或系統(tǒng)進(jìn)程。sysprocesses 只存儲(chǔ)在 master 數(shù)據(jù)庫(kù)中。
列名 數(shù)據(jù)類型 描述
spid smallint SQL Server 進(jìn)程 ID。
kpid smallint Microsoft Windows NT 4.0® 線程 ID。
blocked smallint 分塊進(jìn)程的進(jìn)程 ID (spid)。
waittype binary(2) 保留。
waittime int 當(dāng)前等待時(shí)間(以毫秒為單位)。當(dāng)進(jìn)程不處于等待時(shí),為 0。
lastwaittype nchar(32) 表示上次或當(dāng)前等待類型名稱的字符串。
waitresource nchar(32) 鎖資源的文本化表示法。
dbid smallint 當(dāng)前正由進(jìn)程使用的數(shù)據(jù)庫(kù) ID。
uid smallint 執(zhí)行命令的用戶 ID。
cpu int 進(jìn)程的累計(jì) CPU 時(shí)間。無論 SET STATISTICS TIME ON 選項(xiàng)是 ON 還是 OFF,都為所有進(jìn)程更新該條目。
physical_io int 進(jìn)程的累計(jì)磁盤讀取和寫入。
memusage int 當(dāng)前分配給該進(jìn)程的過程高速緩存中的頁(yè)數(shù)。一個(gè)負(fù)數(shù),表示進(jìn)程正在釋放由另一個(gè)進(jìn)程分配的內(nèi)存。
login_time datetime 客戶端進(jìn)程登錄到服務(wù)器的時(shí)間。對(duì)于系統(tǒng)進(jìn)程,是存儲(chǔ) SQL Server 啟動(dòng)發(fā)生的時(shí)間。
last_batch datetime 客戶端進(jìn)程上次執(zhí)行遠(yuǎn)程存儲(chǔ)過程調(diào)用或 EXECUTE 語(yǔ)句的時(shí)間。對(duì)于系統(tǒng)進(jìn)程,是存儲(chǔ) SQL Server 啟動(dòng)發(fā)生的時(shí)間。
ecid smallint 用于唯一標(biāo)識(shí)代表單個(gè)進(jìn)程進(jìn)行操作的子線程的執(zhí)行上下文 ID。
open_tran smallint 進(jìn)程的打開事務(wù)數(shù)。
status nchar(30) 進(jìn)程 ID 狀態(tài)(如運(yùn)行、休眠等)。
sid binary(85) 用戶的全局唯一標(biāo)識(shí)符 (GUID)。
hostname nchar(128) 工作站的名稱。
program_name nchar(128) 應(yīng)用程序的名稱。
hostprocess nchar(8) 工作站進(jìn)程 ID 號(hào)。
cmd nchar(16) 當(dāng)前正在執(zhí)行的命令。
nt_domain nchar(128) 客戶端的 Windows NT 4.0 域(如果使用 Windows 身份驗(yàn)證)或信任連接的 Windows NT 4.0 域。
nt_username nchar(128) 進(jìn)程的 Windows NT 4.0用戶名(如果使用 Windows 身份驗(yàn)證)或信任連接的 Windows NT 4.0 用戶名。
net_address nchar(12) 指派給每個(gè)用戶工作站上的網(wǎng)絡(luò)接口卡唯一標(biāo)識(shí)符。當(dāng)用戶登錄時(shí),該標(biāo)識(shí)符插入 net_address 列。
net_library nchar(12) 用于存儲(chǔ)客戶端網(wǎng)絡(luò)庫(kù)的列。每個(gè)客戶端進(jìn)程都在網(wǎng)絡(luò)連接上進(jìn)入。網(wǎng)絡(luò)連接有一個(gè)與這些進(jìn)程關(guān)聯(lián)的網(wǎng)絡(luò)庫(kù),該網(wǎng)絡(luò)庫(kù)使得這些進(jìn)程可以建立連接。有關(guān)更多信息,請(qǐng)參見客戶端和服務(wù)器 Net-Library。
loginame nchar(128) 登錄名。
nmliwei http://www.**************.com 2006-11-16 08:18
那滿足什么條件的是死鎖呢?
阿楚 http://www.**************.com 2006-11-16 08:42
當(dāng)某組資源的兩個(gè)或多個(gè)線程之間有循環(huán)相關(guān)性時(shí),將發(fā)生死鎖。
死鎖是一種可能發(fā)生在任何多線程系統(tǒng)中的狀態(tài),而不僅僅發(fā)生在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)中。多線程系統(tǒng)中的一個(gè)線程可能獲取一個(gè)或多個(gè)資源(如鎖)。如果正獲取的資源當(dāng)前為另一線程所擁有,則第一個(gè)線程可能必須等待擁有線程釋放目標(biāo)資源。這時(shí)就說等待線程在那個(gè)特定資源上與擁有線程有相關(guān)性。
如果擁有線程需要獲取另外一個(gè)資源,而該資源當(dāng)前為等待線程所擁有,則這種情形將成為死鎖:在事務(wù)提交或回滾之前兩個(gè)線程都不能釋放資源,而且它們因?yàn)檎却龑?duì)方擁有的資源而不能提交或回滾事務(wù)。例如,運(yùn)行事務(wù) 1 的線程 T1 具有 Supplier 表上的排它鎖。運(yùn)行事務(wù) 2 的線程 T2 具有 Part 表上的排它鎖,并且之后需要 Supplier 表上的鎖。事務(wù) 2 無法獲得這一鎖,因?yàn)槭聞?wù) 1 已擁有它。事務(wù) 2 被阻塞,等待事務(wù) 1。然后,事務(wù) 1 需要 Part 表的鎖,但無法獲得鎖,因?yàn)槭聞?wù) 2 將它鎖定了。事務(wù)在提交或回滾之前不能釋放持有的鎖。因?yàn)槭聞?wù)需要對(duì)方控制的鎖才能繼續(xù)操作,所以它們不能提交或回滾。
死鎖經(jīng)常與正常阻塞混淆。當(dāng)一個(gè)事務(wù)鎖定了另一個(gè)事務(wù)需要的資源,第二個(gè)事務(wù)等待鎖被釋放。默認(rèn)情況下,SQL Server 事務(wù)不會(huì)超時(shí)(除非設(shè)置了 LOCK_TIMEOUT)。第二個(gè)事務(wù)被阻塞,而不是被死鎖。
nmliwei http://www.**************.com 2006-11-16 09:52
我是說在SYSPROCESSES中查死鎖 WHERE后面的條件該怎么寫,不是問大家要死鎖的定義,同志們.
[ 本帖最后由 nmliwei 于 2006-11-16 17:54 編輯 ]
阿楚 http://www.**************.com 2006-11-16 10:32
不好意思,開始時(shí)沒明白你的意思。
找到下面這些,也許會(huì)有些幫助
常看到死鎖的問題,一般都是KILL進(jìn)程,但如果不查出引起死鎖的原因,死鎖會(huì)時(shí)常發(fā)生
可以通過查找引起死鎖的的操作,就可以方便的解決死鎖,現(xiàn)將日常解決問題的方法總結(jié),也許對(duì)大家有幫助
1\死鎖發(fā)生時(shí),通過如下語(yǔ)法,查詢出引起死鎖的操作
use master
go
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR
select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
OPEN s_cur
FETCH NEXT FROM s_cur INTO @spid,@bl
WHILE @@FETCH_STATUS = 0
begin
if @spid =0
select '引起數(shù)據(jù)庫(kù)死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + '進(jìn)程號(hào),其執(zhí)行的SQL語(yǔ)法如下'
else
select '進(jìn)程號(hào)SPID:'+ CAST(@spid AS VARCHAR(10))+ '被' + '進(jìn)程號(hào)SPID:'+ CAST(@bl AS VARCHAR(10)) +'阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語(yǔ)法如下'
DBCC INPUTBUFFER (@bl )
FETCH NEXT FROM s_cur INTO @spid,@bl
end
CLOSE s_cur
DEALLOCATE s_cur
exec sp_who2
2\查找程序/數(shù)據(jù)庫(kù),此t_sql語(yǔ)法在什么地方使用
3\分析找到的,并解決問題
EG:
/*
-------------------------------------------------------
引起數(shù)據(jù)庫(kù)死鎖的是: 71進(jìn)程號(hào),其執(zhí)行的SQL語(yǔ)法如下
EventType Parameters EventInfo
-------------- ---------- ------------------------------------------------
Language Event 0
select * from test
insert test values(1,2)
(所影響的行數(shù)為 1 行)
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
------------------------------------------------------------------------------
進(jìn)程號(hào)SPID:64被進(jìn)程號(hào)SPID:71阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語(yǔ)法如下
EventType Parameters EventInfo
-------------- ---------- ------------------------------------------------
Language Event 0
select * from test
insert test values(1,2)
(所影響的行數(shù)為 1 行)
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
------------------------------------------------------------------------------
進(jìn)程號(hào)SPID:65被進(jìn)程號(hào)SPID:64阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語(yǔ)法如下
EventType Parameters EventInfo
-------------- ---------- --------------------------------------------------------------------------------------------------
Language Event 0 begin tran
select * from test with (holdlock)
waitfor time '12:00'
select * from test
commit
(所影響的行數(shù)為 1 行)
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。
------------------------------------------------------------------------------
進(jìn)程號(hào)SPID:73被進(jìn)程號(hào)SPID:64阻塞,其當(dāng)前進(jìn)程執(zhí)行的SQL語(yǔ)法如下
EventType Parameters EventInfo
-------------- ---------- --------------------------------------------------------------------------------------------------
Language Event 0 begin tran
select * from test with (holdlock)
waitfor time '12:00'
select * from test
commit
(所影響的行數(shù)為 1 行)
DBCC 執(zhí)行完畢。如果 DBCC 輸出了錯(cuò)誤信息,請(qǐng)與系統(tǒng)管理員聯(lián)系。*/
關(guān)鍵字:sql server、數(shù)據(jù)庫(kù)、客戶端
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解