① sqlserver怎麼用sql查看具體哪個表被鎖住了
詳細步驟如下:
1、點擊【新建查詢】按鈕,打開SQL命令編輯框,對資料庫表的操作以及維護都可以通過編輯SQL命令實現。
3、創建數據表的源代碼如下:
use test go
if exists(select name from sys.tables where name='Student')
drop table Student go
create table Student
(sname nchar(10) primary key,
sex nchar(2) not null,
bir datetime)
② 如何查詢鎖表的SQL
用下邊的語句查詢,如果想結束直接kill
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)
③ 如何查看SQL數據有沒有鎖表
後續版本的 Microsoft SQL Server 將刪除該功能。請避免在新的開發工作中使用該功能,並著手修改當前還在使用該功能的應用程序。若要獲取有關 SQL Server 資料庫引擎中的鎖的信息,請使用 sys.dm_tran_locks 動態管理視圖。
USE master;
GO
EXEC sp_lock 53;
GO
④ sql server 2000 查看哪些表被鎖
usemaster--必須在master資料庫中創建
go
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_lockinfo]')andOBJECTPROPERTY(id,N'IsProcere')=1)
dropprocere[dbo].[p_lockinfo]
GO
/*--處理死鎖
查看當前進程,或死鎖進程,並能自動殺掉死進程
因為是針對死鎖的,所以如果有死鎖進程,只能查看死鎖進程
當然,你可以通過參數控制,不管有沒有死鎖,都只查看死鎖進程
*/
/*--調用示例
execp_lockinfo
--*/
createprocp_lockinfo
@kill_lock_spidbit=0,--是否殺掉死鎖的進程,1殺掉,0僅顯示
@show_spid_if_nolockbit=1--如果沒有死鎖的進程,是否顯示正常進程信息,1顯示,0不顯示
as
setnocounton
declare@countint,@snvarchar(1000),@iint
selectid=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#tfrom(
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=0
frommaster..sysprocessesajoin(
selectblockedfrommaster..sysprocessesgroupbyblocked
)bona.spid=b.blockedwherea.blocked=0
unionall
select'|_犧牲品_>',
spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
status,hostname,program_name,hostprocess,nt_domain,net_address,
s1=blocked,s2=1
frommaster..sysprocessesawhereblocked<>0
)aorderbys1,s2
select@count=@@rowcount,@i=1
if@count=0and@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
frommaster..sysprocesses
set@count=@@rowcount
end
if@count>0
begin
createtable#t1(idintidentity(1,1),anvarchar(30),bInt,EventInfonvarchar(255))
if@kill_lock_spid=1
begin
declare@spidvarchar(10),@標志varchar(10)
while@i<=@count
begin
select@spid=進程ID,@標志=標志from#twhereid=@i
insert#t1exec('dbccinputbuffer('+@spid+')')
if@@rowcount=0insert#t1(a)values(null)
if@標志='死鎖的進程'exec('kill'+@spid)
set@i=@i+1
end
end
else
while@i<=@count
begin
select@s='dbccinputbuffer('+cast(進程IDasvarchar)+')'from#twhereid=@i
insert#t1exec(@s)
if@@rowcount=0insert#t1(a)values(null)
set@i=@i+1
end
selecta.*,進程的SQL語句=b.EventInfo
from#tajoin#t1bona.id=b.id
orderby進程ID
end
setnocountoff
go
⑤ 怎麼知道資料庫表已經鎖表了
可直接在mysql命令行執行:show engine innodb statusG;
查看造成死鎖的sql語句,分析索引情況,然後優化sql然後show processlist;
show status like 『%lock%』
show OPEN TABLES where In_use > 0; 這個語句記錄當前鎖表狀態
另外可以打開慢查詢日誌,linux下打開需在my.cnf的[mysqld]裡面加上以下內容:
slow_query_log=TRUE(有些mysql版本是ON)
slow_query_log_file=/usr/local/mysql/slow_query_log.txt
long_query_time=3
select *from v$locked_object:可以獲得被鎖的對象的object_id及產生鎖的會話sid。通過查詢結果中的object_id,可以查詢到具體被鎖的對象。
注意事項
也可以直接把這幾個視圖和表關聯起來,在查詢結果中直接得到「alter system kill session 'sid, serial#'」這樣的方便的kill sessoin命令。
如果執行kill session命令後,鎖並沒有除掉,session依然存在。這種情況,通過select spid from v$process where addr in(select paddr from v$session where sid = &sid)查詢到oracle會話在伺服器上的pid,然後登陸到伺服器上,執行kill -9 pid這樣就能殺掉進程解鎖了。
⑥ 能不能用sql查到當前有哪些表被哪些用戶鎖住了
show OPEN TABLES where In_use > 0;
SHOW PROCESSLIST查看資料庫中表的狀態,是否被鎖;
kill id //殺掉被鎖的表!
⑦ 怎麼查看 sql server 資料庫有沒有鎖表
查看sql server資料庫被鎖表可以用用如下語句:
拓展資料:
SQL Server 是Microsoft 公司推出的關系型資料庫管理系統。具有使用方便可伸縮性好與相關軟體集成程度高等優點,可跨越從運行Microsoft Windows 98 的膝上型電腦到運行Microsoft Windows 2012 的大型多處理器的伺服器等多種平台使用。
Microsoft SQL Server 是一個全面的資料庫平台,使用集成的商業智能 (BI)工具提供了企業級的數據管理。Microsoft SQL Server 資料庫引擎為關系型數據和結構化數據提供了更安全可靠的存儲功能,使您可以構建和管理用於業務的高可用和高性能的數據應用程序。
⑧ oracle 鎖表時,怎麼查出是哪些SQL語句導致了鎖表
SELECT /*+ rule */ lpad(' ',decode(l.xisn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xisn DESC
執行此SQL即可,結果一看便知,適用於oracle, 其他不解釋~
⑨ 請求sql server怎麼查鎖表的信息,造成鎖表的SQL、IP、發生的時間等,需要關聯哪幾個表
DECLARE @spid INTDECLARE @blk INTDECLARE @count INTDECLARE @index INTDECLARE @lock TINYINT SET @lock=0 CREATE TABLE #temp_who_lock ( id INT IDENTITY(1, 1), spid INT, blk INT ) --if @@error<>0 return @@error INSERT INTO #temp_who_lock (spid, blk)SELECT 0, blockedFROM (SELECT * FROM master..sysprocesses WHERE blocked > 0)aWHERE NOT EXISTS(SELECT * FROM master..sysprocesses WHERE a.blocked = spid AND blocked > 0)UNIONSELECT spid, blockedFROM master..sysprocessesWHERE blocked > 0 --if @@error<>0 return @@error SELECT @count = Count(*), @index = 1FROM #temp_who_lock --select @count,@index --if @@error<>0 return @@error IF @count = 0 BEGIN SELECT '沒有阻塞和死鎖信息' --return 0 END WHILE @index <= @count BEGIN IF EXISTS(SELECT 1 FROM #temp_who_lock a WHERE id > @index AND EXISTS(SELECT 1 FROM #temp_who_lock WHERE id <= @index AND a.blk = spid)) BEGIN SET @lock=1 SELECT @spid = spid, @blk = blk FROM #temp_who_lock WHERE id = @index SELECT '引起資料庫死鎖的是: ' + Cast(@spid AS VARCHAR(10)) + '進程號,其執行的SQL語法如下' ; SELECT @spid, @blk DBCC inputbuffer(@spid) DBCC inputbuffer(@blk) END SET @index=@index + 1 END IF @lock = 0 BEGIN SET @index=1 WHILE @index <= @count BEGIN SELECT @spid = spid, @blk = blk FROM #temp_who_lock WHERE id = @index IF @spid = 0 SELECT '引起阻塞的是:' + Cast(@blk AS VARCHAR(10)) + '進程號,其執行的SQL語法如下' ELSE SELECT '進程號SPID:' + Cast(@spid AS VARCHAR(10)) + '被' + '進程號SPID:' + Cast(@blk AS VARCHAR(10)) + '阻塞,其當前進程執行的SQL語法如下' PRINT ( LTRIM(@spid) + ''+ LTRIM(@blk)); if(@spid <> 0) BEGIN DBCC inputbuffer(@spid) -- END DBCC inputbuffer(@blk) --引起阻塞語句 SET @index=@index + 1 END END DROP TABLE #temp_who_lock --return 0 --KILL 54
⑩ 如何查看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結束它