场景描述
在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found when trying to get lock; try restarting transaction…)。
问题分析
这个异常并不会影响用户使用,因为数据库遇到死锁会自动回滚并重试。用户的感觉就是操作稍有卡顿。但是监控老是报异常,所以需要解决一下。
解决方法
在应用程序中update的地方使用try-catch。
我自己封装了一个函数,如下。
/**
查询锁表
select object_name,machine,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 ;
杀表(程序内杀)
alter system kill session '543,9206';
如果杀不掉可以查这个来获取spid(将获取的spid给有权限的网络管理员,他就给你杀了
代码如下: mysql_query(“set autocommit=0”); $list_one = $db->fetch_first(“select * from prizes where id = “.$id.” FOR UPDATE”); $db->query(“DELETE from prizes WHERE id =”.$list_one[‘id’]); mysql_query(“commit”); START TRANSACTION, COMMIT和ROLLBACK语法
当多个事务同时持有和请求同一资源上的锁而产生循环依赖的时候产生了死锁。死锁发生在事务试图以不同的顺序锁定资源。以StockPrice表上的两个事务为例:
事务1
START TRANSACTION;
update StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '