知识备忘 | 数据库常见死锁原因

数据进行并发控制的2种基本锁

-共享锁:当数据对象被加上共享锁,可以读取,不能修改修改
-排他锁:当数据对象被加上排他锁,其他事务不能对它进行读取和修改

常见死锁情况

事务之间对资源访问顺序的交替

出现原因:A访问表a锁住了表a,然后又访问了b。B访问b锁住了b,企图访问表a。A和B都等待对方释放表。
解决办法:常见,由于程序BUG导致。需要调整程序逻辑。

并发修改同一记录

出现原因:A查询1条记录,修改该条记录。这时B也查询并要修改该条记录。A的共享锁企图上升为排他锁,而这时B由于A的共享锁存在,等待A释放。而A由于B的共享锁存在而无法上升到排他锁,故不能释放共享锁。
解决办法:隐蔽,大型项目经常发生,使用乐观锁或者使用悲观锁进行控制,或sqlsever的更新锁。

索引不当导致全表扫描

出现原因:事务中执行了一个不满足条件的语句,执行全表扫描,行级锁上升为表级锁,多个事务这样执行后容易导致死锁,或当表中的数据量非常庞大,而索引建的过少或不合适的时候,使得经常进行全表扫描,使得应用系统越来越慢,最总阻塞或死锁。
解决办法:SQL不要太复杂,对有全表扫描的sql建立索引或优化。

事务封锁范围大且互相等待
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若...
    夏海社长阅读 914评论 0 0
  • 锁在平时的工作中接触的比较少(InnDB帮我们做了不少事),所以这里在Java3y 的文章上加上了自己的理解。本文...
    Michaelhbjian阅读 756评论 0 2
  • 文章导读: 累兮,累兮,要死兮...... 本文解决问题: 1、表级锁定(读锁、写锁) 2、行级锁定(共享锁、排他...
    创造new_world阅读 662评论 0 1
  • 全天上课,其他时间休息。
    f720a6b91a73阅读 307评论 0 1
  • 留存许久的储蓄 在一夜间蒸发殆尽 即使让躯体打开或裸露 蚯蚓般蠕动依然深情款款 空调尘封一隅之后 禁不住一个激灵一...
    南屯游子阅读 300评论 0 3