数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。即:
l 原子性(atomicity):事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。
l 一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。
l 隔离性(isolcation):为了防止事务直接相互影响,由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。根据不同的要求,隔离级别可以分为四种(串行化,可重复读,读已提交,读未提交)。
l 持续性(durability):事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
SQL标准定义了4类隔离级别分别是:可串行化,可重复读,读已提交,读未提交。
l 可串行化Serializable
是事务最高的隔离级别。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。因为它采用了类似线程同步的概念,当一个事务开始操作数据时,其他所有的事务都不能进行除查询外的其他操作,只能等待当前事务完成提交。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。
l 可重复读Repeatable Read
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。它采用的是数据缓存策略,即当事务开始后,第一次读取数据后会把数据缓存起来,当再次进行相同操作时,直接返回缓存的数据,这样即使数据库内容发生了改变,当前事务内所读取的结果还是一致的。
l 读已提交Read Committed
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。一个事务在结束时会执行一个命令,commit(提交)或者 rollback(回滚),前者即确认事务所做的操作,后者则为撤销整个事务的所有操作。此隔离级别的服务将不会看到其他并行服务在commit之前所进行的操作。
l 读未提交Read Uncommitted
这是最低的隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read),因为别的服务有可能会执行rollback操作,这样提前读取到的数据可能会出现问题。
四种级别的隔离,各有自己的优缺点,级别越高则安全性越高,但并发性越低,低级别的隔离则支持更高的并发处理,并要求较低的系统开销,究竟使用哪种,还有根据具体项目的相关要求而决定。