BiPerler 2020-05-04
默认不会加读锁!但 MySQL InnoDB 的可重复读并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是 next-key locks。
MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ)。
四个级别逐渐增强,每个级别解决一个问题。
所以 InnoDB 默认还是会出现幻读现象的,所以还是可能会加锁。
银行A开启了一个事务窗口,查询当前系统中有没有"wangwu"用户,发现没有,银行B也开启了一个事务窗口,查询当前系统中也没有"wangwu"用户,银行A先创建"wangwu"用户并且提交,由于可重复读取,银行B在一次事务中必须保证查询的数据一致性,因此查询不到"wangwu",结果银行B窗口认为wangwu没有被注册想注册"wangwu"用户,就创建"wangwu"用户结果发现系统提示"wangwu"用户已经被注册",但是在本次事务中又查询不到"wangwu",就好像出现幻觉一样
create table user( id int primary key, username varchar(30), money double ); insert into user values(1,‘zhangsan‘,100); insert into user values(2,‘lisi‘,100);
打开两个MySQL窗口
解决幻读可以提高事务隔离级别为 Serializable (串行化),它是使用的共享锁,当然 MySQL 有锁的类型:共享锁(S)、排他锁(X)、意向共享(IS)、意向排他(IX)。 还有非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。