我自己的資料庫表記錄死鎖後的 根據以下資料的 解決方案:
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死鎖的解除方法:
createproc
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 ...