脏读(一个事务读取到另一个事务未提交的数据)
下面的例子,a就这样骗走了b的100块钱的货物
不可重复读(一个事务读取到另一个事务已经提交的数据)
下面的例子,b获取的数据前后不一致
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。
幻读(一个事务多次查询整表数据,由于其他事务新增(删除)记录造成多次查询的记录条数不同(一个事务读取到另一个事务已经提交的数据))
下面的例子,在d做查询的时候,c进来存了2000块,造成avg的结果与预期不一致
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题
针对上面的三个问题,数据库提出四大隔离级别
隔离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可串行化(Serializable ) | 不可能 | 不可能 | 不可能 |
mysql默认是 Repeatable read 这个隔离级别
设置隔离级别的语句
set [session/global] transaction isolation level ...;——修改隔离级别
select @@tx_isolation;——查询当前数据库的隔离级别