测试前提:关闭mysql事务的自动提交功能
#查看主键
SHOW INDEX FROM t1;
#查看事务是否自动提交
show variables like 'autocommit';
#查看当前会话事务的隔离级别
show variables like 'tx_isolation';
#关闭事务的自动提交功能
set autocommit=0
1.脏读
现象:事务B读到了事务A尚未提交的数据
设置当前会话隔离级别为读未提交
set session transaction isolation level read uncommitted;
2.不可重复读
现象:同一个事务中两次读取的数据不一致,因为中间其他的事务进行数据修改(update)并提交
设置当前会话事务隔离级别为读已提交
set session transaction isolation level read committed;
3.幻读
现象:A事务进行操作,B查询时无感知,若A为插入操作B插入同一主键的记录会报错,若A为删除操作B更新同条记录会被告知影响行数为0,若A为更新操作B直接覆盖了A的更新,就像出现了幻觉一样,同时也说明了B读不到A已经提交的数据,即此隔离级别解决了不可重复读问题。(若A未提交B操作时会阻塞等待)
设置事务隔离级别为可重复读
set session transaction isolation level repeatable read;
注:上述隔离级别的设置为会话级别的,重新连接即为默认的可重复读级别
幻读的解决方案:保证并发事务中执行插入时主键不一致,唯一键不冲突;