一直记不住ACID,在此标记一下:
一个事务本质上有四个特点ACID:
- Atomicity原子性
- Consistency一致性
- Isolation隔离性
- Durability耐久性
原子性 - Atomicity
原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作。-------- 我的理解就是类似赋值操作,'='就是原子性的操作
一致性 - Consistency
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。--------- 我的理解是多线程取同一个数据时,必须保证取到的数据都是同一个值,如果其中一个线程改变了值,那么必须保证其他线程取到的值也同步修改。
一致性有下面特点:
- 如果一个操作触发辅助操作(级联,触发器),这些也必须成功,否则交易失败。
- 如果系统是由多个节点组成,一致性规定所有的变化必须传播到所有节点(多主复制)。如果从站节点是异步更新,那么我们打破一致性规则,系统成为“最终一致性”。
- 一个事务是数据状态的切换,因此,如果事务是并发多个,系统也必须如同串行事务一样操作。
在现实中,事务系统遭遇并发请求时,这种串行化是有成本的, Amdahl法则描述如下:它是描述序列串行执行和并发之间的关系。
“一个程序在并行计算情况下使用多个处理器所能提升的速度是由这个程序中串行执行部分的时间决定的。”
大多数数据库管理系统选择(默认情况下)是放宽一致性,以达到更好的并发性。
隔离性 - Isolation
事务是并发控制机制,他们交错使用时也能提供一致性。隔离让我们隐藏来自外部世界未提交的状态变化,一个失败的事务不应该破坏系统的状态。隔离是通过用悲观或乐观锁机制实现的。-------- 我的理解就是上述多线程发生时,一个线程有三个操作步骤,当线程1的第一个步骤使数据发生变化了,那么线程2和线程3都拿到了新的值,然后2和3按照新值去计算,但是线程1执行第二步是发生错误,需要回滚,数据回滚到最初的值,但是2和3已经按照最新的计算了,没法回滚。所以需要隔离性,把线程1的第一步修改的值隐藏起来,不让外界发现(或者说线程1发生了数据修改,但是线程2和3仍然取不到)。
耐久性 - Durability
一个成功的事务将永久性地改变系统的状态,所以在它结束之前,所有导致状态的变化都记录在一个持久的事务日志中。如果我们的系统突然受到系统崩溃或断电,那么所有未完成已提交的事务可能会重演。