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