SQL Server 表,記錄 死鎖解決辦法

2021-09-06 10:42:54 字數 4613 閱讀 5376

我自己的資料庫表記錄死鎖後的 根據以下資料的 解決方案:

1. 先根據以下語句 查詢 哪些表被 死鎖,及 死鎖的  spid

select request_session_id spid,object_name

(resource_associated_entity_id)tablename

from

sys.dm_tran_locks

where resource_type=

'object

'

2. 再根據以上 語句查詢出來的 spid 通過以下儲存過程 查詢是哪台機客戶機 在操作,造成的死鎖

exec sp_who2 '

***'

--*** 是 spid 替換進去就好,就可以看到是哪台機造成的死鎖.

3. 最後通過 以下語句來清退程序,(當然我這次是因為查到是哪機子在操作,所以讓那台機子的客戶機退出客戶端 就可以了.)

kill ***   --

*** 是spid 執行就好

方法一:

摘自:

前些天寫乙個儲存過程,儲存過程中使用了事務,後來我把一些**注釋掉來進行除錯找錯,突然發現一張表被鎖住了,原來是建立事務的**忘記注釋掉。本文表鎖住了的解決方法。

-其實不光是上面描述的情況會鎖住表,還有很多種場景會使表放生死鎖,解鎖其實很簡單,下面用乙個示例來講解:

1 首先建立乙個測試用的表:

複製** **如下:

create table test

( tid int identity(1,1)

) 2 執行下面的sql語句將此表鎖住:

複製** **如下:

select * from test with (tablockx)

3 通過下面的語句可以檢視當前庫中有哪些表是發生死鎖的:

複製** **如下:

select request_session_id spid,object_name(resource_associated_entity_id)tablename

from sys.dm_tran_locks

where resource_type='object '

4 上面語句執行結果如下:

spid :被鎖程序id。

tablename:發生死鎖的表名。

5 只需要使用kill關鍵字來殺掉被鎖的程序id就可以對錶進行解鎖:

kill 52

詳細出處參考:

方法二:

摘自:

sql server死鎖使我們經常遇到的問題,下面就為您介紹如何查詢sql server死鎖,希望對您學習sql server死鎖方面能有所幫助。

sql server死鎖的查詢方法:

exec master.dbo.p_lockinfo 0,0

---顯示死鎖的程序,不顯示正常的程序

exec master.dbo.p_lockinfo 1,0

---殺死死鎖的程序,不顯示正常的程序

sql server死鎖的解除方法:

create

proc

p_lockinfo

@kill_lock_spid

bit=

1, --

是否殺掉死鎖的程序,1 殺掉, 0 僅顯示

@show_spid_if_nolock

bit=1--

如果沒有死鎖的程序,是否顯示正常程序資訊,1 顯示,0 不顯示

asdeclare

@count

int,@s

nvarchar(1000),@i

intselect id=

identity(int,1,1

),標誌,

程序id

=spid,執行緒id=kpid,塊程序id=blocked,資料庫id=

dbid,

資料庫名

=db_name(dbid),使用者id=uid,使用者名稱=loginame,累計cpu時間=

cpu,

登陸時間

=login_time,開啟事務數=open_tran, 程序狀態=

status,

工作站名

=hostname,應用程式名=program_name,工作站程序id=

hostprocess,

網域名稱=nt_domain,網絡卡位址=

net_address

into #t from

( select 標誌=

'死鎖的程序

',

spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,

status,hostname,program_name,hostprocess,nt_domain,net_address,

s1=a.spid,s2=

0from master..sysprocesses a join

( select blocked from master..sysprocesses group

byblocked

)b on a.spid=b.blocked where a.blocked=

0union

allselect

'|_犧牲品_>

',

spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,

status,hostname,program_name,hostprocess,nt_domain,net_address,

s1=blocked,s2=

1from master..sysprocesses a where blocked<>

0)a

order

bys1,s2

select

@count

=@@rowcount,@i=1

if@count=0

and@show_spid_if_nolock=1

begin

insert

#t

select 標誌=

'正常的程序

',

spid,kpid,blocked,dbid,

db_name

(dbid),uid,loginame,cpu,login_time,

open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address

from

master..sysprocesses

set@count

=@@rowcount

endif

@count

>

0begin

create

table #t1(id int

identity(1,1),a nvarchar(30),b int,eventinfo nvarchar(255

))

if@kill_lock_spid=1

begin

declare

@spid

varchar(10),@標誌

varchar(10

) while

@i<=

@count

begin

select

@spid

=程序id,@標誌

=標誌 from #t whereid=

@iinsert #t1 exec('

dbcc inputbuffer('+

@spid+'

)')

if@標誌='

死鎖的程序

'exec('

kill'+

@spid

)

set@i=@i

+1endend

else

while

@i<=

@count

begin

select@s=

'dbcc inputbuffer('+

cast(程序id as

varchar)+')

'from #t whereid=

@iinsert #t1 exec(@s

)

set@i=@i

+1endselect a.*,程序的sql語句=

b.eventinfo

from #t a join #t1 b on a.id=

b.id

end

方法三:

1、select * from sys.dm_tran_locks或sp_lock 檢視request_node 欄位中為'x'(排他鎖)或'ix'(意向排他鎖)

2、用sp_who2 + pid(程序id) 檢視程序的詳細資訊

3、用dbcc inputbuffer(pid) 檢視一起死鎖的語句內容

以上方法應該能解決你的問題。

操作表記錄

練習表記錄的操作 表記錄的插入 表記錄的更新 表記錄的查詢 表記錄的刪除 實現此案例需要按照如下步驟進行。步驟一 刪除上次試驗stu info表中記錄 刪除stu info表的所有記錄 mysql delete from stu info query ok,3 rows affected 0.00 ...

操作表記錄

2.操作表記錄 問題練習表記錄的操作 1 表記錄的插入 2 表記錄的更新 3 表記錄的查詢 4 表記錄的刪除 步驟實現此案例需要按照如下步驟進行。步驟一 刪除上次試驗stu info表中記錄 刪除stu info表的所有記錄 mysql delete from stu info query ok,3...

合併表記錄

資料表記錄包含表索引和數值 int範圍的整數 請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值公升序進行輸出。先輸入鍵值對的個數 然後輸入成對的index和value值,以空格隔開 輸出合併後的鍵值對 多行 示例1輸入 40 1 0 21 2 3 4輸出 0 31 2 ...