数据库事务隔离级别,事务隔离级别
事务的特征:ACID
Atomicity:原子性
Consistency:一致性
Isolation:隔离性
Duration:持久性
在SQL标准中定义了事务的四种隔离级别:
1,read uncommitted 未提交读
事务中的修改,即使没有提交,对其他事务也都是可见的。即事务可以读取未提交的数据,即会产生脏读。
2,read committed 提交读
大都数系统都是这个级别的,oracle就是这个级别,但是MySQL不是这个级别的。
该事务级别定义:一个事务开始时,只能“看见”已经提交的事务所做的修改。换句话说,一个事务从开始到提交,所做的任何修改对其他的事务都是不可见的。
3,repeatable read 可重复读
读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。MySQL默认是此级别的。
4,serializable 可串行化
它是最高隔离级别,Serializable会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。
大多数的数据库默认隔离级别为: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 次读出来的记录数不一样
若你说的这种情况是2个事务(读写在一个事务中),不会出现这种情况。
4个事务可能会出现这个问题。