一.数据库事务有四个:
由低到高依次为:
1.Read uncommitted(读未提交)
2.Read committed(读提交)
3.Repeatable read(重复读)
4.Serializable(序列化)
这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题
①. 脏读:在一个事务A在提交的过程中另一个事务B对其进行了查询,B读到的数据为修改后的数据,
而此时事务A发现操作错误将之前的修改回滚到了最初状态,那么事务B读到的数据就是错误的数据,产生了脏读。
总结就是一个事务读到了另一个事务尚未提交的数据,而之后另一个事务因为某些原因将提交的状态又回滚了,此时就产生了脏读。
解决方法:在一个事务写操作提交之前,另一个事务不能对其进行读
②.不可重复读:事务A多次读取一个数据,事务A一次读取,读到的数据为20。
后另一个事务B对其进行了修改,将20改为30,事务A再一次读取该数据,第二次读到的数据为30,
在事务A两次读取中的结果是不一致的,这就是不可重复读。总结就是一个事务不断的对某数据进行查询,
在查询过程中另一个事务对该数据进行了修改(已提交),就发生了两次读取数据不一致的现象,即不可重复读。
解决方法:一个事务读操作时,另一个事务不能进行写操作。
③.幻读:幻读发生在事务不是独立执行的时候。比如有两个事务A和B,两个事务都要对表进行操作,
事务A修改了表中的全部数据而此时事务B在表中添加了一行,之后事务A就会发现表中还有未修改的数据,就会产生幻读。
预防的方式就是在一个事务完成对表的操作时其他事务均不能在表中添加新的行。
解决方法:一个事务读写操作时,另一个事务不能对其就行读写操作
二.脏读、不可重复读、幻读三者的区别:
脏读:事务A读、事务B写但未提交
不可重复读:事务A多次读,事务B在事务A读数据中对M进行了修改(已提交,脏读是未提交)。
幻读:跟前两者不同的是两个事务都要发生写操作