脏读
(两个事务,同时操作对方尚未提交的数据)
脏读又称无效数据读出。一个事务读取另外一个事务还没有提交的数据叫脏读。
例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。
解决办法:把数据库的事务隔离级别调整到READ_COMMITTED
不可重复读:
(事务1内的第一次读取与第二次读取不同,在事务1两次读取的过程中,存在其他事务更改了数据)
不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。
例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。 解决办法:把数据库的事务隔离级别调整到REPEATABLE_READ
幻读:
(事务1内的第一次读取与第二次读取不同,第二次读取时出现了新数据,)
例如:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入(注意时插入或者删除,不是修改))了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样。这就叫幻读。
解决办法:把数据库的事务隔离级别调整到SERIALIZABLE_READ
本质:
几个隔离级别的本质为:事务之间的锁控制机制不同
可重复读的实现机制:乐观锁,当有事务对数据修改时,会对数据版本+1,原来的事务使用老版本查询,查到的仍是老数据
串行化的实现机制:事务读写锁
默认级别
oracle、sqlserver 默认级别为:读已提交
mysql 默认级别为:可重复读
参考:
https://www.cnblogs.com/xiaohanlin/p/8644749.html
https://blog.csdn.net/hemeinvyiqiluoben/article/details/80928070