MySQL的四种事务隔离级别
事务的四大特性ACID
1.原子性(Atomicity):一个事务要么全部执行,要么全部不执行,如果执行过程中出现异常则回滚;犹如化学中的原子一样具有不可分割性(别跟我较真啊,虽然原子又可以分为质子、中子、电子等);
2.一致性(Consistency):事务的一致性则是指事务的开启前后,数据库的完整性约束并没有被破坏;即A向B转账,转账前后A和B的总金额还是不变的;
3.隔离性(ISOLocation):同一时间,只允许一个事务请求一个数据,不同的事务之间没有互相的干扰;这主要是针对于并发事务来讲,又并发事务所做的数据修改必须与其他并发事务隔离开进行;事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同;
隔离性设置成最高级别可串行化的时候,在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
4.持久性( Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚;
事务的四种隔离级别以及产生的问题
1.读未提交(read Uncommited):在该隔离级别,所有的事务都可以读取到别的事务中未提交的数据,会产生脏读问题,在项目中基本不怎么用,安全性太差;
2.读已提交(read commited):这是大多数数据库默认的隔离级别,但是不是MySQL的默认隔离级别;这个隔离级别满足了简单的隔离要求:一个事务只能看见已经提交事务所做的改变,所以会避免脏读问题;
由于一个事务可以看到别的事务已经提交的数据,于是随之而来产生了不可重复读和虚读等问题(下面详细介绍这种问题,结合问题来理解隔离级别的含义);
3.可重复读(Repeatable read):这是MySQL的默认隔离级别,它确保了一个事务中多个实例在并发读取数据的时候会读取到一样的数据;不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
4.可串行化(serializable):事物的最高级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问