数据库死锁了怎么办

  今天看书的时候,书中写到了到了数据库解决死锁的几个方法,特此做个笔记

  死锁是个啥?


  一句话概括就是,有两个人叫甲和乙,又两个资源叫a和b,甲拿了a然后需要b,乙在甲拿了a的时候拿了b然后要a,此时甲和乙都拿着对方需要的资源,咋办呢。没办法,你瞪着我,我瞪着你,这就是死锁。

  数据库死锁是个啥?


  先看一段sql:

START TRANSACTION;
UPDATE A SET a=1 WHERE ID=2;
UPDATE A SET a=2 WHERE ID=2;
COMMIT;

START TRANSACTION;
UPDATE A SET a=2 WHERE ID=1;
UPDATE A SET a=1 WHERE ID=1;
COMMIT;


  上面这两个事务如果都执行了第一条update语句,更新了一行数据,同时也锁定了该行数据,接着两个事务都去尝试执行第二条update语句,这时会发现该行被对方锁定了,然后两个事务都等待对方释放锁,同时又持有对方需要的锁,这时死锁就形成了。如果没有外部因素介入,它们理论上能锁到是世界末日。

  那数据库咋解决这种冲突呢?


  为了解决死锁的问题,数据库引入了死锁检测和死锁超时机制。越复杂的系统(比如innodb存储引擎),越能快速的检测到死锁的循环依赖,并立即报错。

  还有一种方式,就是当查询的时间达到超时的设定后放弃锁请求,这种方式提高了数据库的可用性。

  目前国内用的比较多的MySQL的innodb存储引擎目前的处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值