查看死锁位置,分析。
二、
首先解决死锁可以从死锁发生的条件入手,最容易解决的就是更改获取资源的顺序;
其次是避免长事务,让事务执行的时间尽可能少,让事务的覆盖范围尽可能小,长事务会导致并发度降低,且会有更多的SQL查 询延迟;
给整个方法加事务是否是必须的?可以不加事务的尽量不加。
第一步,查出已锁的进程
查看正在锁的事务
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 //查看锁表
exec sp_lock 快捷键 C_2exec sp_who active exec sp_who快捷键 C_1
用Profiler里面的Locks->Deadlock graph 监控看看,如果看到了死锁图,就可以比较形象地展现死锁发生的过程,还可以看到锁的具体类型和过程里面的语句,对你诊断会有帮助。
Declare @LockTab table( spid int,dbid int ,ObjId int,IndId int ,Type varchar(50),Resource varchar(50),Mode varchar(50),Status varchar(50))
insert into @LockTab exec sp_lock
Declare @ActiveTab table(spid int,ecid int,status varchar(50),loginname varchar(50),hostname varchar(50),blk int,dbname varchar(50),cmd varchar(50),request_id int)
insert into @ActiveTab exec sp_who active
select * from @LockTab lt
left join @ActiveTab at on lt.spid=at.spid
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)