?
??今天看书的时候,书中写到了到了数据库解决死锁的几个方法,特此做个笔记
?
??死锁是个啥?
? ??一句话概括就是,有两个人叫甲和乙,又两个资源叫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存储引擎目前的处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。 ?
|