做网站公司599,wordpress gold,英文网站建设注意什么,福州做网站改版哪里比较好死锁的产生条件
互斥、请求和保持、不可剥夺、循环等待
MySQL锁类型 死锁复现
环境#xff1a;Mysql 5.7版本#xff0c;Innodb引擎#xff0c;可重复度隔离级别 并发场景下使用duplicate key update插入或更新数据可能会造成死锁#xff0c;下面就产生死锁的条件进行模…死锁的产生条件
互斥、请求和保持、不可剥夺、循环等待
MySQL锁类型 死锁复现
环境Mysql 5.7版本Innodb引擎可重复度隔离级别 并发场景下使用duplicate key update插入或更新数据可能会造成死锁下面就产生死锁的条件进行模拟 表
CREATE TABLE song_rank (id int(11) NOT NULL AUTO_INCREMENT,songId int(11) NOT NULL,weight int(11) NOT NULL DEFAULT 0,PRIMARY KEY (id),UNIQUE KEY songId_idx (songId) USING BTREE
) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8隔离级别可重复度RR
select tx_isolation;预先插入两条数据
idsongIdweight1103022030 关闭事务自动提交
select autocommit;
set autocommit0;死锁场景一
记录锁循环等待如果两个事务并发读写相同行会由于加锁时机的不同而造成死锁导致其中一个事务执行失败mysql可以配置自动检测死锁然后自动断开其中一个innodb_deadlock_detect
## 事务一
# 第一步执行
begin;
insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;
# 第三步执行
insert into song_rank(songId,weight) values(16,100) on duplicate key update weightweight1;## 事务二
# 第二步执行
begin;
insert into song_rank(songId,weight) values(16,100) on duplicate key update weightweight1;
# 第四步执行
insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;执行步骤事务一事务二锁状态第一步begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;事务一对17新增记录锁第二步begin;insert into song_rank(songId,weight) values(16,100) on duplicate key update weightweight1;事务二对16新增记录锁第三步insert into song_rank(songId,weight) values(16,100) on duplicate key update weightweight1;事务一等待事务二释放16的记录锁第四步insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;事务二等待事务一释放17的记录锁出现死锁
死锁场景二
记录锁、间隙锁循环等待在并发插入、更新同一条数据时一个事务获取了记录锁一个事务在等待记录排他锁则事务在执行插入获取间隙锁是会造成死锁。
# 事务一
# 第一步执行
begin;
insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;
# 第四步执行
rollback# 事务二
# 第二步执行
begin;
insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;# 事务三
# 第三步执行
begin;
insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;
# 出现死锁
执行步骤事务一事务二事务三锁状态第一步begin; insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;事务一对17新增记录锁第二步begin;insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;事务二等待17记录锁第三步begin;insert into song_rank(songId,weight) values(17,100) on duplicate key update weightweight1;事务三等待17的记录锁第四步rollback;事务二获取17记录锁事务三等待17记录锁事务一获取间隙锁时需要等待事务三释放17记录锁出现死锁
避免死锁
控制并发写入和更新 先执行插入捕获插入异常并处理更新数据