事务可由一条非常简单的SQL语句组成,也可以有一组复杂的SQL语句组成。事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中操作,要么都做修改,要么都不做,这就是事务的目的,也是事务模型区别与文件系统的重要特征之一
对于InnoDB而言,其默认的事务隔离级别为RR,完全遵循和满足事务的ACID特性
A(atomicity)原子性,在计算机系统中,每个人都将原子性视为理所当然,例如在C语言中调用SQRT函数,其要么返回正确的平方根值要么返回错误的代码。
然而在数据库事务中实现调用操作的原子性,就不是那么理所当然了。例如用户在ATM机前取款的过程称为原子性操作,要么都做,要么都不做,不能用户钱未从ATM取得,但是银行卡的钱已经扣除了,而通过事务模型,可以保证操作的的原子性
原子性是指整个数据库事务是不可分割工作单位,只有使事务中所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL语句执行失败,已经执行成功的SQL语句必须撤回,数据库状态应该退回执行事务前的状态
如果事务中的操作是只读,要保持原子性是很简单的,一旦发生任何错误,要么重试,要么返回错误代码。因为只读操作不会改变系统中任何相关部分,但是当事务中的操作需要改变系统中的状态时,例如插入记录或更新记录,那么情况可能就不像只读操作那么简单了。如果操作失败,很有可能引起状态的变化,因此必须保证保护系统中并发用户访问受影响部分数据
C(consistency)一致性 一致性是指事务将数据库从一种状态转变为下一种一致的状态,在事务开始之前和事务结束以后,数据库的完整性约束并没有被破坏。例如,表中有一个字段为姓名,为唯一约束,即在表中中姓名不能重复。如果一个事务对姓名字段进行了修改,但是在事务提交或事务操作发生回滚后,表的姓名变得非唯一了,这就破坏了事务的一致性要求,即事务将从一种状态变为一种不一致的状态,因此事务是一致性的单位,如果事务中的某个动作失败了,系统可以自动撤销事务---返回初始化状态
I(isolation)隔离性。隔离性还有其他称呼,如并发控制(concurrency control)、可串行化(serializability)、锁(locking)等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离,即该事务提交对其他事务是不可见的,通常这使用锁来实现。当前数据库系统中提供了一种粒度锁(granular lock)的策略,允许事务锁住一个实体对象的自己,以此来提高事务之间的并发度
D(durability)持久性事务一旦提交,其结果是永久性的,即发生宕机扥故障,数据库也能将数据恢复。需要注意的是,只能从事务本身的角度来保证结果永久性。例如,在事务提交后,所有的变化都是永久的。即使当数据库因为崩溃而需要恢复时,也能保证恢复后提交的数据都不会丢失。但若不是数据库本身发生故障,而是一些外部原因,如RAID卡损坏、自然灾害等原因问题导致数据库发生问题,那么所有提交的数据都有可能会丢失。因此持久性保证事务系统的高可靠性(High Reliability),而不是高可用性(High Aavilability)。对于高可用性的实现,事务本身并不能保证,需要一些系统共同配合来完成