事务
数据库事务,是指作为单个逻辑工作单元的一系列操作,要么完全执行,要么完全不执行。事务中有的操作没有成功完成,整个事务中的所有操作都需要被回滚。
ACID
数据库事务拥有以下四个特性,习惯上称为:ACID。在数据库领域,ACID模型是最古老并且最重要的概念之一。
原子性(Atomicity):原子在当时被认为是最小的物质,也就意味着不可在分。事务被视为是不可分割的最小单元,事务中的所有操作要么全部提交成功,要么全部失败回滚。
一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
隔离性(Isolation):主要描述多个事务之间的关系,多个事务并发执行时,一个事务的执行不应该影响其他事务的执行。也就是说一个事务所做的修改在commit之前,对其他事务是不可见的。
持久性(Durability):已经被提交的事务对数据的修改应该永久保存在数据库中,即使系统崩溃,事务执行结果也不能丢失。
事务的ACID特性概念定义简单,但是有的特性并不是很好理解,因为这些特性不是平级关系,比如一致性。一致性C是事务最终的目的,而AID都是手段。
一致性状态实际上依赖于应用层,也就是开发者自己去定义的。举个栗子,大家最喜欢用的银行转账:
A向B转账100元,那么对应的操作应该有两步:1,A账户-100元;2,B账户+100元。那么我们这个事务中的两步操作是为了满足事务前后的一致性状态:总金额一致,但是这个一致性状态本身和数据库的约束没有关系,是由我们的业务决定的。
- 事务的最终目的是要满足一致性,这样的执行结果才是正确的(符合我们业务要求)
- 如果事务串行执行,只要事务满足原子性,其执行结果就可以满足一致性
- 如果事务并行执行,也就是并发的情况下,既要满足原子性又要满足隔离性,才能最终满足一致性
- 持久性是指要永久保存执行结果,即使数据库崩溃,可以理解为执行结果要保存到磁盘中
并发一致性
上文提到事务串行执行,只要满足原子性就可以满足一致性,但是如果在并发情况下,还需要满足隔离性才能满足一致性,