数据库在进行insert,update,delete这些更新操作的时候为了保证数据一致性都会使用排他锁。
一个事务里进行update操作,在事务结束之前(commit or rollback)排他锁不会被释放。因此在一个事务里update多条数据的时候执行顺序就尤为重要,两个并发事务中更新操作的执行顺序不同就有可能产生死锁:(x, y分别表示一行数据)
transaction A { transaction B {
getXLock(); getYLock();
update x; update y;
getYLock(); getXLock();
update y; update x;
} finally { } finally {
releaseXLock(); releaseYLock();
releaseYLock(); releaseXLock();
} }
另外,如果执行的update操作不在事务里,但一个update操作更新了多行数据(ex: update .. set .. where id > 1),在大并发的情况下也会有死锁的风险,原因仍然是与更新数据行的顺序有关。因此还是推荐更新操作最好以主键作为条件最为严谨,否则就需要在程序中先对更新的数据进行排序再进行批量更新(ex: update .. set .. where id in (1, 2, 3, 4..))。
当然如果是读写锁,要考虑读写的频率。
分享到:
相关推荐
数据库死锁,阻塞查询,杀死死锁,阻塞进程
一个经典的获取SQLSERVEr数据库死锁及引起锁定的进程的存储过程。执行时,必须具有数据库超级管理员权限。
较实用的ORACLE数据库死锁查杀,实用性较强。
SQLServer数据库死锁介绍,以及使用独立的事务模拟死锁的产生。
数据库死锁,导致其他更新操作无法进行 此时需要查询出该死锁的进程,将其杀死
查询SQL server数据库死锁存储过程
关于Oracle数据库死锁问题的研究与讨论
分布式课堂上分享讲的ppt,简要介绍了死锁检测的基本概念,以及分布式数据库几种常见的死锁检测算法。
数据库 死锁的解决 其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B 另一个用户B 访问表B(锁住了表B),然后企图访问表A 这时用户A由于用户B已经锁住表B,它...
服务器运行一天后,就开始频繁报错:Deadlock found when trying to get to lock; try restarting transaction. 死锁的头号原因是外键未加索引,第二号原因是位图索引遭到并发更改;
解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。
数据库死锁监控,自动刷新,右键杀死进程,查看存储历史执行时间等信息。
判断数据库死锁的SQL,可以检测出死锁的语句和进程
解决Sybase数据库死锁
数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁数据库死锁
Oracle数据库死锁问题研究.pdf
数据库死锁分析.doc