事务是一个常见的概念,是对程序运行时异常数据处理的抽象,把多个读写规则抽象成一个操做单元,要么所有成功(commit),要么所有失败(rollback);失败后能够安全地重试。事务使程序无需关心系列操做部分失败的状况,可是否须要事务、如何作事务的并发处理,须要对其有深刻理解。数据库
原子是化学中的概念,指没法再切分的粒度。在多线程中,一个线程执行原子操做,指操做的中间态对其余线程不可见;这和事务中的隔离性类型。安全
事务的原子性指:要么全作,要么全不作;在错误时停止,能够撤销已经完成的修改。多线程
一致性比原子性有更多的含义:数据副本的一致性、分区的一致性哈希、CAP的线性化。并发
事务的一致性:的一组特定陈述必须始终成立,即不变量。性能
例如,一个借贷系统中,初始借款和放贷金额始终相等;在一系列还款再放贷后的事务操做后,这个等式依旧成立。spa
一致性的条件是由业务逻辑维护的,由原子性保障实现的。假设贷方帐户有1000元,业务代码扣掉这1000元,并打给借方帐户1100元,一致性就被破坏了。线程
事务是数据库提供的特性,因此事务的特性应当是描述数据库自己提供的能力、而非对使用方的约束规范:乔·海勒斯坦(Joe Hellerstein)指出,在论Härder与Reuter的论文中,“ACID中的C”是被“扔进去凑缩写单词的”,并且那时候你们都不怎么在意一致性。事务
隔离性相似上文提到的多线程原子操做。数据库一般是并发访问的,并发事务也可能操做相同的记录。ci
事务相互隔离,不会相互冒犯(不能冒犯相对于不可见、不可执行是更广义的隔离,因此有多种事务隔离级别)。狭义的事务隔离性指可序列化,但可序列化会有很大的性能损失。it
不一样事物隔离级别的隔离性也不同,下文会重点讨论。
持久化是存储系统对业务的承诺,事务的持久性指:一旦commit,写入的数据不会丢失。
没有绝对的持久性,例如全部副本的硬盘都毁掉时。