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 @@error0 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 @@error0 return @@error SELECT @count = Count(*), @index = 1FROM #temp_who_lock --select @count,@index --if @@error0 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
成都创新互联公司致力于互联网网站建设与网站营销,提供成都网站设计、做网站、网站开发、seo优化、网站排名、互联网营销、小程序制作、公众号商城、等建站开发,成都创新互联公司网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。
查看被锁表: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)
能查询 但是不能插入修改删除操作。
--查看被锁表: 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)
1.创建测试表,如下图。
createtabletest_lock(idnumber,valuevarchar2(200));
2.执行append语句;并且不做提交,insert/*+append*/intotest_lockvalues(1,1)如下图。
3.再次执行清表语句,truncatetabletest_lock;报锁表错误,如下图。
4.查看锁表语句,发现被锁表
selectb.object_name,t.*
fromv$locked_objectt,user_objectsb
wheret.object_id=b.object_id
注意事项:
简化数据:可以将复杂的查询创建为其他人可以使用的视图,而不必了解复杂的业务或逻辑关系。这简化并掩盖了视图用户数据的复杂性。
表结构设计的补充:在设计的系统才刚刚开始,大部分的程序直接访问数据表结构,但是随着业务的变化,系统更新,等等,引起了一些表结构不适用,这次修改系统的表结构太大,开发成本较高的影响。
这个时候可以创建一个视图来补充表结构设计,降低开发成本。程序可以通过查询视图直接获得它想要的数据。
添加安全性:视图可以向用户显示表中的指定字段,而不是向用户显示表中的所有字段。在实际开发中,视图通常作为提供数据的一种方式提供,并将只读权限提供给第三方以供查询使用。
查看被锁表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
spid 锁表进程
tableName 被锁表名
第一步,查出已锁的进程
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
``
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
``
INNODB_TRX表主要是包含了正在InnoDB引擎中执行的所有事务的信息,包括waiting for a lock和running的事务
select * from information_schema.innodb_trx
``
第二步,kill进程
show engin innodb status; //最后一次死锁信息及sql
show open tables where in_use 0 //查看锁表