當前位置:首頁 » 編程語言 » sql怎麼看被卡住
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql怎麼看被卡住

發布時間: 2023-08-11 18:34:19

1. 如何查看sql死鎖

其實所有的死鎖最深層的原因就是一個:資源競爭
表現一:
一個用戶A
訪問表A(鎖住了表A),然後又訪問表B
另一個用戶B
訪問表B(鎖住了表B),然後企圖訪問表A
這時用戶A由於用戶B已經鎖住表B,它必須等待用戶B釋放表B,才能繼續,好了他老人家就只好老老實實在這等了
同樣用戶B要等用戶A釋放表A才能繼續這就死鎖了
解決方法:
這種死鎖是由於你的程序的BUG產生的,除了調整你的程序的邏輯別無他法
仔細分析你程序的邏輯,
1:盡量避免同時鎖定兩個資源
2:
必須同時鎖定兩個資源時,要保證在任何時刻都應該按照相同的順序來鎖定資源.
表現二:
用戶A讀一條紀錄,然後修改該條紀錄
這是用戶B修改該條紀錄
這里用戶A的事務里鎖的性質由共享鎖企圖上升到獨占鎖(for
update),而用戶B里的獨占鎖由於A有共享鎖存在所以必須等A釋
放掉共享鎖,而A由於B的獨占鎖而無法上升的獨占鎖也就不可能釋放共享鎖,於是出現了死鎖。
這種死鎖比較隱蔽,但其實在稍大點的項目中經常發生。
解決方法:
讓用戶A的事務(即先讀後寫類型的操作),在select
時就是用Update
lock
語法如下:
select
*
from
table1
with(updlock)
where
....

2. 如何查看SQL Server 2008的死鎖

為了查看死鎖信息,資料庫引擎提供了監視工具,分別為兩個跟蹤標志以及
SQL
Server
Profiler中的死鎖圖形事件。
跟蹤標志
1204
和跟蹤標志
1222
發生死鎖時,跟蹤標志
1204
和跟蹤標志
1222
會返回在
SQL
Server
錯誤日誌中捕獲的信息。跟蹤標志
1204
會報告由死鎖所涉及的每個節點設置格式的死鎖信息。跟蹤標志
1222
會設置死鎖信息的格式,順序為先按進程,然後按資源。可以同時啟用這兩個跟蹤標志,以獲取同一個死鎖事件的兩種表示形式。
SQL
Server
Profiler
中的
TraceEvent
Class:
LocksEvent
Name:
Deadlock
Graph
提供
一個XML
圖表.,你可以從中看出發生了什麼。

3. 如何查看oracle 中某條sql阻塞了某個sql

死鎖的定位方法
通過檢查資料庫表,能夠檢查出是哪一條語句被死鎖,產生死鎖的機器是哪一台。
1)用dba用戶執行以下語句

selectusername,lockwait,status,machine,programfromv$sessionwheresidin
(selectsession_idfromv$locked_object)

如果有輸出的結果,則說明有死鎖,且能看到死鎖的機器是哪一台。欄位說明:
Username:死鎖語句所用的資料庫用戶;
Lockwait:死鎖的狀態,如果有內容表示被死鎖。
Status: 狀態,active表示被死鎖
Machine: 死鎖語句所在的機器。
Program: 產生死鎖的語句主要來自哪個應用程序。
2)用dba用戶執行以下語句,可以查看到被死鎖的語句。

selectsql_textfromv$sqlwherehash_valuein
(selectsql_hash_valuefromv$sessionwheresidin
(selectsession_idfromv$locked_object))

4. sqlserver怎麼用sql查看具體那個表被鎖住了

查看被鎖表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'

--spid 鎖表進程
--tableName 被鎖表名

解鎖:

declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)

--查詢出死鎖的SPID
select 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)

--輸出引起死鎖的操作
DBCC INPUTBUFFER (@spid)
--查詢當前進程數

select count(-1) from sysprocesses
where dbid in (select dbid from sysdatabases where name like '%telcount%');

5. 如何查看SQL表死鎖

SELECT SPID=p.spid,
DBName = convert(CHAR(20),d.name),
ProgramName = program_name,
LoginName = convert(CHAR(20),l.name),
HostName = convert(CHAR(20),hostname),
Status = p.status,
BlockedBy = p.blocked,
LoginTime = login_time,
QUERY = CAST(t.TEXT AS VARCHAR(MAX))
FROM MASTER.dbo.sysprocesses p
INNER JOIN MASTER.dbo.sysdatabases d
ON p.dbid = d.dbid
INNER JOIN MASTER.dbo.syslogins l
ON p.sid = l.sid
CROSS APPLY sys.dm_exec_sql_text(sql_handle) t
WHERE p.blocked = 0
AND EXISTS (SELECT 1
FROM MASTER.dbo.sysprocesses p1
WHERE p1.blocked = p.spid)
SELECT SPID=p.spid,
DBName = convert(CHAR(20),d.name),
ProgramName = program_name,
LoginName = convert(CHAR(20),l.name),
HostName = convert(CHAR(20),hostname),
Status = p.status,
BlockedBy = p.blocked,
LoginTime = login_time,
QUERY = CAST(t.TEXT AS VARCHAR(MAX))
FROM MASTER.dbo.sysprocesses p
INNER JOIN MASTER.dbo.sysdatabases d
ON p.dbid = d.dbid
INNER JOIN MASTER.dbo.syslogins l
ON p.sid = l.sid
CROSS APPLY sys.dm_exec_sql_text(sql_handle) t
WHERE p.blocked = 0
AND EXISTS (SELECT 1
FROM MASTER.dbo.sysprocesses p1
WHERE p1.blocked = p.spid)
用這個查詢兩次,如果兩次都有某個語句就是了,可以用kill結束它

6. 如何查看sql 死鎖圖

使用SQL Server Profiler,新建跟蹤-連接資料庫-事件選擇頁簽,「顯示所有事件」那裡打勾,然後展開「Locks」,第一行就是死鎖圖。把這一行勾上,點擊「運行」。當資料庫中出現死鎖時,就能看到死鎖圖了。

7. 如何查看死鎖的」SQL語句「或」存儲過程「

假如發生了死鎖,我們怎麼去檢測具體發生死鎖的是哪條SQL語句或存儲過程?此時我們可以使用以下存儲過程來檢測,就可以查出引起死鎖的進程和SQL語句。

Sql代碼
usemaster
go
create proceresp_who_lock
as
begin
declare @spid int,@blint,
@intTransactionCountOnEntryint,
@intRowcountint,
@intCountPropertiesint,
@intCounter int

create table #tmp_lock_who(
id intidentity(1,1),
spidsmallint,
blsmallint)

IF @@ERROR<>0 RETURN@@ERROR

insert into#tmp_lock_who(spid,bl) select 0 ,blocked
from (select * fromsysprocesses where blocked>0 ) a
where not exists(select *from
(select * from sysprocesseswhere blocked>0 ) b
wherea.blocked=spid)
union select spid,blockedfrom sysprocesses where blocked>0

IF @@ERROR<>0 RETURN@@ERROR

-- 找到臨時表的記錄數
select @intCountProperties= Count(*),@intCounter = 1
from#tmp_lock_who

IF @@ERROR<>0 RETURN@@ERROR

if@intCountProperties=0
select '現在沒有阻塞和死鎖信息' as message

-- 循環開始
while @intCounter <=@intCountProperties
begin
-- 取第一條記錄
select @spid = spid,@bl =bl
from #tmp_lock_who where Id= @intCounter
begin
if @spid=0
select '引起資料庫死鎖的是: '+ CAST(@bl ASVARCHAR(10))
+ '進程號,其執行的SQL語法如下'
else
select '進程號SPID:'+ CAST(@spid AS VARCHAR(10))
+ '被進程號SPID:'+ CAST(@bl ASVARCHAR(10))
+ '阻塞,其當前進程執行的SQL語法如下'DBCC INPUTBUFFER

use master
go
create proceresp_who_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntryint,
@intRowcount int,
@intCountProperties int,
@intCounter int

create table #tmp_lock_who(
id int identity(1,1),
spid smallint,
bl smallint)

IF @@ERROR<>0 RETURN@@ERROR

insert into#tmp_lock_who(spid,bl) select 0 ,blocked
from (select * fromsysprocesses where blocked>0 ) a
where not exists(select *from
(select * from sysprocesseswhere blocked>0 ) b
where a.blocked=spid)
union select spid,blockedfrom sysprocesses where blocked>0

IF @@ERROR<>0 RETURN@@ERROR

-- 找到臨時表的記錄數
select @intCountProperties= Count(*),@intCounter = 1
from #tmp_lock_who

IF @@ERROR<>0 RETURN@@ERROR

if @intCountProperties=0
select '現在沒有阻塞和死鎖信息' as message

-- 循環開始
while @intCounter <=@intCountProperties
begin
-- 取第一條記錄
select @spid = spid,@bl =bl
from #tmp_lock_who where Id= @intCounter
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
與鎖定有關的兩個問題--死鎖和阻塞