事物引发的问题:
更新丢失:两个或多个事务选择同一行,然后基于最初选定的值更新数据,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题(最后更新的覆盖了之前更新的数据)
脏读:一个事务正在对一条记录做修改,在这个事务完成并提交之前这条记录的数据就处于不一致状态;这时另一个事务读取同一条记录,如果不加控制,第二个事务读取到了这些“脏”数据
不可重复读:一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现读出的数据已经发生了改变,或者记录被删除了
幻读:一个事务按相同的查询条件重新读取以前检索过的数据,发现其他事物插入了满足查询条件的新数据。
隔离级别
read uncommitted 未提交读(脏读)
事物在修改中,即使没有提交其它事物也是可见的。会出现脏读的情况。从性能上来说,不会比其它的级别好太多。
read committed 提交读(不可重复读)
事物从开始到提交之前所做的任何修改,对其它事物都是不可以见的。也叫不可重复读,因为两次读取的内容可能不一样。
大多数数据库默认的隔离级别,mysql 不是。
repeatable read 可重复读
在同一个事物中,多次读取同样的记录结果是一致的。解决了脏读问题。
在理论上无法解决另外一个幻读问题:事物A 读取范围内的记录时,事物B在此范围内又插入了记录,此时事物A再次读取此范围的记录时会产生幻行(Phantom row)。InnoDB 和 XtraDB 存储引擎通过多版本并发控制解决了幻读问题。
mysql 默认的隔离级别。
serializable 可串行化
通过强制事物串行执行,避免了前面说的幻读的问题。
serializable 会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。
隔离级别 脏读可能性 不可重复读可能性 幻读可能性 加锁读
read uncommitted yes yes yes no
read committed no yes yes no
repeatable read no no yes no
serializable no no no yes