什么是幻读
幻读是指在事务执行期间,两次相同条件的读取,后面一次读取的结果中出现了前一次读取的结果中不存在的数据。出现这个问题的原因是因为其他事务执行之后新增了符合条件的数据,或将原有数据修改为符合条件。
幻读的影响
幻读带来的后果主要有两个:
1. 结果不符合预期
幻读会导致事务执行出现意料之外的结果,例如事务1查询主键为a的记录,如果不存在,则插入。
假如事务1查询主键为a的记录不存在时,事务2插入了主键为a的记录并提交,那么事务1执行插入语句时就会报错。
2. 主从数据同步时可能出现数据不一致问题
假设有数据库表t
create table t (
a int,
b int
) engine=innodb
同时有两个事务需要执行
事务1 | 事务2 |
---|---|
begin | |
1. update t set a = 2 where b = 1; | |
begin | |
2. insert into t (a, b) values(1, 1); | |
commit | |
commit |
假设源表中只有一条b=1的记录(0, 1)
,那么第1条语句执行完毕之后,紧接着事务2执行完毕并提交了