参考: 小林coding
MySQL服务器同时处理多个事务时,会出现脏读,不可重复读,幻读问题。
脏读
一个事务读到另一个未提交事务修改过的数据。
举例:事务A先读取数据,并对其进行修改,此时事务B进行读取获取到事务A修改后的数据,而事务A此时发生回滚,那么事务B得到的就是过期的数据。
不可重复读
一个事务内多次读取同一个数据,出现前后二次读取到的数据不一致。
下图事务A前后二次查询的结果不一致。
幻读
在一个事务内多次查询某个符合条件的记录数量,出现前后二次查询到的记录数量不一致。
下图事务B前后二次查询不一致。
脏读,不可重复读,幻读总结
脏读:读到另一个未提交事务的数据。
不可重复读:前后二次读到的数据不一致,后一次读到已提交事务的数据。
幻读:前后二次读到的记录数不一致,后一次读到已提交事务的修改结果。
SQL标准提出四种隔离级别来处理上述情况,隔离级别越高,性能就越低。
读未提交:一个事务未提交时,它的变更可以被其他事务看到。
读提交:一个事务提交之后,它的变更才能被其他事务看到。
可重复读:一个事务内,前后二次的查询的数据是一致的。MySQL InnoDB引擎默认隔离级别。
串行化:给记录加锁,多个事务发生读写冲突时,后访问的事务要等前一个事务执行完成之后才能执行。
不同隔离级别可能出现的问题。