如下内容出自《高性能MySQL》第三版,了解事务的ACID及四种隔离级有助于咱们更好的理解事务运做。数据库
下面举一个银行应用是解释事务必要性的一个经典例子。假如一个银行的数据库有两张表:支票表(checking)和储蓄表(savings)。如今要从用户Jane的支票帐户转移200美圆到她的储蓄帐户,那么至少须要三个步骤:安全
一、检查支票帐户的余额高于或者等于200美圆。并发
二、从支票帐户余额中减去200美圆。性能
三、在储蓄账户余额中增长200美圆。atom
上述三个步骤的操做必须打包在一个事务中,任何一个步骤失败,则必须回滚全部的步骤。spa
能够用START TRANSACTION语句开始一个事务,而后要么使用COMMIT提交将修改的数据持久保存,要么使用ROLLBACK撤销全部的修改。事务SQL的样本以下:blog
1. start transaction;事务
2. select balance from checking where customer_id = 10233276;ci
3. update checking set balance = balance - 200.00 where customer_id = 10233276;get
4. update savings set balance = balance + 200.00 where customer_id = 10233276;
5. commit;
ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。一个很好的事务处理系统,必须具有这些标准特性:
原子性(atomicity)
一个事务必须被视为一个不可分割的最小工做单元,整个事务中的全部操做要么所有提交成功,要么所有失败回滚,对于一个事务来讲,不可能只执行其中的一部分操做,这就是事务的原子性
一致性(consistency)
数据库老是从一个一致性的状态转换到另外一个一致性的状态。(在前面的例子中,一致性确保了,即便在执行第3、四条语句之间时系统崩溃,支票帐户中也不会损失200美圆,由于事务最终没有提交,因此事务中所作的修改也不会保存到数据库中。)
隔离性(isolation)
一般来讲,一个事务所作的修改在最终提交之前,对其余事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个帐户汇总程序开始运行,则其看到支票账户的余额并无被减去200美圆。)
持久性(durability)
一旦事务提交,则其所作的修改不会永久保存到数据库。(此时即便系统崩溃,修改的数据也不会丢失。持久性是个有占模糊的概念,由于实际上持久性也分不少不一样的级别。有些持久性策略可以提供很是强的安全保障,而有些则未必,并且不可能有能作到100%的持久性保证的策略。)
隔离级别:
READ UNCOMMITTED(未提交读)
在READ UNCOMMITTED级别,事务中的修改,即便没有提交,对其余事务也都是可见的。事务能够读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会致使不少问题,从性能上来讲,READ UNCOMMITTED不会比其余的级别好太多,但却缺少其余级别的不少好处,除非真的有很是必要的理由,在实际应用中通常不多使用。
READ COMMITTED(提交读)
大多数数据库系统的默认隔离级别都是READ COMMTTED(但MySQL不是)。READ COMMITTED知足前面提到的隔离性的简单定义:一个事务开始时,只能"看见"已经提交的事务所作的修改。换句话说,一个事务从开始直到提交以前,所作的任何修改对其余事务都是不可见的。这个级别有时候叫作不可重复读(nonrepeatble read),由于两次执行一样的查询,可能会获得不同的结果
REPEATABLE READ(可重复读)
REPEATABLE READ解决了脏读的问题。该隔离级别保证了在同一个事务中屡次读取一样记录结果是一致的。可是理论上,可重复读隔离级别仍是没法解决另一个幻读(Phantom Read)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当以前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB存储引擎经过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题。
SERIALIZABLE(可串行化)
SERIALIZABLE是最高的隔离级别。它经过强制事务串行执行,避免了前面说的幻读的问题。简单来讲,SERIALIZABLE会在读取每一行数据都加锁,因此可能致使大量的超时和锁争用问题。实际应用中也不多用到这个隔离级别,只有在很是须要确保数据的一致性并且能够接受没有并发的状况下,才考虑采用该级别。
打钩说明该隔离级别还存在这种状况,打X表明该隔离级别已经解决了这种状况:
做者:陆炫志 出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111 您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归做者全部,欢迎转载,但请保留该声明。 |