这几天,在查看文章时,发现了一个Mysql并发的问题,在一开始仅仅凭借眼睛去查看时,并未发现问题及解决方法,于是我们对其进行了具体实际操作和测试:
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)
一、问题
一个事务内:insert记录后根据字段p来update这条记录,然而当出现并发操作的时候,update处会发生dead lock问题,把update改为id,就没事了。
同一个表,高并发事务,事务内先插入一条记录,再更新这条记录:
(1)如果更新的是唯一索引,有异常;
(2)如果更新的是自增主键,就没有异常;
画外音:先不要被“dead lock”描述所迷惑,是死锁问题,阻塞问题,还是其他异常,还另说。
二、测试问题及复现
2.1 数据准备
create table t (id int(20) primary key AUTO_INCREMENT,cell varchar(20) unique)engine=innodb;
新建表: (1)存储引擎是innodb,MySQL版本是5.6; (2)id字段,自增主键; (3)cell字段,唯一索引;
start transaction;
insert into t(cell) values(11111111111);
insert into t(cell) values(22222222222);
insert into t(cell) values(33333333333);
commit;
插入一些测试数据。
2.2 session参数设置
设置事务隔离级别为RR(repeatable read)
--设置手动提交
--设置事务隔离级别为RR
set session autocommit=0;
set session transaction isolation level repeatable read;
2.3 模拟并发
多个终端session模拟