美文网首页
知识备忘 | 数据库常见死锁原因

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

作者: 发光吧 | 来源:发表于2018-11-20 11:17 被阅读0次

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

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

    常见死锁情况

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

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

    并发修改同一记录

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

    索引不当导致全表扫描

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

    事务封锁范围大且互相等待

    相关文章

      网友评论

          本文标题:知识备忘 | 数据库常见死锁原因

          本文链接:https://www.haomeiwen.com/subject/bfrtqqtx.html