事务算是后台编写中最基本的,最重要的也是有些难度的一块知识,而且应用场景很多,遇到复杂的场景就会发晕,这里再次细致地整理,巩固,学习一下。知识点比较多,拆成5篇学习,依次为
- 事务概念,ACID介绍
- 数据库的事务的控制
- 数据库的隔离级别,悲观锁与乐观锁
- jdbc的事务控制
- spring的事务的控制,事务的传播
- 具体应用场景
第一篇开始↓
概念
事务机制是可以保证一系列写操作要么全部完成,要么全部不会完成,不会发生只完成一系列中一两个写操作,事务机制缺省^1一般由数据库完成,也可以通过应用程序实现(如Java的JTA等)
ACID
一个事务本质上有四个特点ACID,他们分别是:
- Atomicity原子性
- Consistency一致性
- Isolation隔离性
- Durability耐久性
原子性
原子性任务是一个独立的操作单元,是一种要么全部是,要么全部不是的原子单位性的操作,不可分割(虽然现在发现比原子更小的单位了)。
一致性
一个事务可以改变状态(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
一致性有下面特点:
- 如果一个操作触发辅助操作(级联,触发器),这些也必须成功,否则交易失败。
- 如果系统是由多个节点组成,一致性规定所有的变化必须传播到所有节点(多主复制^2)。如果从站节点是异步更新,那么我们打破一致性规则,系统成为“最终一致性^3”。
- 一个事务是数据状态的切换,因此,如果事务是并发多个,系统也必须如同串行事务一样操作。
在现实中,事务系统遭遇并发请求时,这种串行化是有成本的, Amdahl法则描述如下:它是描述序列串行执行和并发之间的关系。
“一个程序在并行计算情况下使用多个处理器所能提升的速度是由这个程序中串行执行部分的时间决定的。”
大多数数据库管理系统选择(默认情况下)是放宽一致性,以达到更好的并发性。
隔离性
事务是并发控制机制,他们交错使用时也能提供一致性。隔离让我们隐藏来自外部世界未提交的状态变化,一个失败的事务不应该破坏系统的状态。隔离是通过用悲观或乐观锁机制实现的。隔离级别和锁后面会说到
耐久性
一个成功的事务将永久性地改变系统的状态,所以在它结束之前,所有导致状态的变化都记录在一个持久的事务日志中。如果我们的系统突然受到系统崩溃或断电,那么所有未完成已提交的事务可能会重演。
尽管一些数据库系统提供多版本并发控制 MVCC, 他们的并发控制都是通过锁完成,因此,锁会增加执行的串行性,影响并发性。
以上都是我查的文档和自己的个人理解,欢迎指教,探讨。
绝大部分文字引用自jdon,感谢前辈们~