大多数的数据库默认隔离级别为:Read Commited 比如 sql server、Oracle少数数据库默认隔离级别为:Repeatable Read 比如: MySql InnoDB 1、脏读:(事务没有提交,提前读取) :当一个事务正在访问数据库,并且对数据进行修改 而这种修改还没有提交到数据库中,这是,另外一个事物访问数据库,然后使用了这个数据。 2、不可重复读(两次读的数据不一致) 一个事务内,多次读同一个数据,在这个事务还没有结束时,另外一个事务也访问该同一个数据,那么在一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次分别读取的数据可能会不一样,这样就发生了一个事务内两次读到的数据不一致。 3、幻读:当事务不是独立执行时发生的一种现象,例如:第一个事务对一个表中的数据进行修改,这种修改涉及到表中的全部数据行,同时,第二个事务也修改这个表中的数据,这种修改时向表中插入一行新数据,那么以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像幻觉一样。 4.第一类更新丢失(回滚丢失):
当2个事务更新相同的数据源,如果第一个事务被提交,而另外一个事务却被撤销,那么会连同第一个事务所做的跟新也被撤销。也就是说第一个事务做的跟新丢失了。
5.第二类更新丢失(覆盖丢失):
第二类更新丢失实在实际应用中经常遇到的并发问题,他和不可重复读本质上是同一类并发问题,通常他被看做不可重复读的特例:当2个或这个多个事务查询同样的记录然后各自基于最初的查询结果更新该行时,会造成第二类丢失更新。因为每个事务都不知道不知道其他事务的存在,最后一个事务对记录做的修改将覆盖其他事务对该记录做的已提交的跟新... Isolation (隔离)属性一共支持五种事务设置,具体介绍如下:
DEFAULT (默认)使用数据库设置的隔离级别,由 DBA 默认的设置来决定隔离级别 .
READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )
READ_COMMITTED 会出现不可重复读、幻读问题(锁定正在读取的行)
REPEATABLE_READ 会出幻读(锁定所读取的所有行)
SERIALIZABLE 保证所有的情况不会发生(锁表)
不可重复读的重点是修改 :
同样的条件 , 你读取过的数据 , 再次读取出来发现值不一样了
幻读的重点在于新增或者删除同样的条件 , 第 1 次和第 2 次读出来的记录数不一样