幻读:
T1读取了一个字段,T2对字段进行了
插入
。此时T1再次读取时仍然为原来的数据,不过T1如果对T2插入行同样进行插入时就会报错。
实例:
实验环境:
mysql-5.6.43,事务自动提交进行关闭 set autocommit=0;
实验流程:
创建连个session,一个进行事务一T1,一个执行事务二T2。T2进行插入数据,T1进行测试幻读结果。
1)
#事务T1第一次查看数据行
mysql> select * from auto_test;
2)
#事务二在131行进行插入
mysql> insert auto_test values(131,‘huandu’);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.11 sec)
3)
#事务T1第二次查看数据行
可以看出尽管事务二插入了数据,事务一再进行查看时两者数据相同
但是
4)
事务T1对131行进行插入时就会发现
mysql> insert auto_test values(131,‘false’);
ERROR 1062 (23000): Duplicate entry ‘131’ for key ‘PRIMARY’
由于id为主键提示不可对131行进行重复插入。
5)
事务T1对131进行更新是会发现
mysql> update auto_test set name=‘huandu update’ where id=131;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
对事务T1进行提交并查看会发现
数据插入并进行了更新。
6)
幻读与不可重读:不可重复读为T1未提交第一次读取和T2对表进行更新之后T1再次读取的结果不一致。
幻读:T1两次读取的结果一致,通过上例可以看出,但是在实际表中已经存在了T2插入的一条记录。