admin管理员组文章数量:1025585
今天看书的时候,书中写到了到了数据库解决死锁的几个方法,特此做个笔记
死锁是个啥?
一句话概括就是,有两个人叫甲和乙,又两个资源叫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存储引擎目前的处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。
今天看书的时候,书中写到了到了数据库解决死锁的几个方法,特此做个笔记
死锁是个啥?
一句话概括就是,有两个人叫甲和乙,又两个资源叫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存储引擎目前的处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。
版权声明:本文标题:数据库死锁了怎么办 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1743860714a2042386.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论