自己在复习的时候根据书本知识总结的,应该是不够全面。主要参考的《数据库系统概念》第六版
ps:这书的译版太难读了
- 原子性(Atomicity):十五点所有操作在数据库中要么全部正确反映出,要么完全不反映
- 一致性(Consistency):隔离执行事务(在没有其他事务并发执行的情况)保持数据库的一致性
- 隔离性(Isolation):尽管多个事务可能并发执行,系统保证,对于任何一对事务 T i , T j T_i,T_j Ti,Tj,在 T i T_i Ti看来, T j T_j Tj要么在 T i T_i Ti开始之前已经执行完成,要么在 T i T_i Ti完成之后开始执行。每个事务都感觉不到有其他事务在并发执行
- 持久性(Durability):事务成功完成后,对数据库的改变是永久的,即使出现系统故障
r e a d ( X ) read(X) read(X):从数据库把数据项X床送到执行read操作的事务的主缓冲区的一个也称为X的变量中
w r i t e ( X ) write(X) write(X):从执行write的事务的主缓冲区的变量X把数据项传回数据库中
可串行化
只有在 I , J I,J I,J全为 r e a d read read指令时,两条指令的执行顺序才是无关紧要的
当 I , J I,J I,J为不同事物在相同数据项上的操作、至少有一个是 w r i t e write write指令时,I,J是冲突(conflict)的
如果调度 S S S可以经过一系列非冲突指令交换称 S ′ S' S′,称 S S S与 S ′ S' S′是冲突等价(conflict equivalent)的
若调度 S S S与一个串行调度冲突等价,则称 S S S是冲突可串行化(conflict serializable)的
可恢复调度:对于每对事务 T i , T j T_i,T_j Ti,Tj,如果 T j T_j Tj读取了之前由 T i T_i Ti所写的数据项,则 T i T_i Ti先于 T j T_j Tj提交
无级联调度:对于每对事务 T i , T j T_i,T_j Ti,Tj,如果 T j T_j Tj读取了之前由 T i T_i Ti所写的数据项,则 T i T_i Ti必须在 T j T_j Tj这一读操作前提交。(每一个无级联调度都是可恢复调度)
事务隔离性级别
所有隔离性都不允许脏写:如果数据项已经被另外一个尚未提交或终止的事务写入,则不允许对该数据项执行写操作
级别 | 说明 |
---|---|
可串行化 | 保证可串行化调度 |
可重复读 | 只允许读取已提交数据,在一个事物两次读取一个数据项期间,其他事务不得更新该数据(不要求串行化) |
已提交读 | 只允许读取已提交数据,不要求可重复读 |
未提交读 | 允许读取未提交数据(SQL允许的最低一致性级别) |
并发控制
事务 T T T获取数据项 Q Q Q上的共享型锁(shared-mode lock)(记为S)/排他型锁(exclusive-mode lock)(记为X)
锁 | 读 | 写 |
---|---|---|
共享的(shared) | √ | × |
排他的(exclusive) | √ | √ |
两阶段封锁协议
保证可串行性的一个协议,协议要求每个事务分两阶段提出加锁和解锁申请:
- 增长阶段:事务可以获得锁,不能释放
- 缩减阶段:事务可以释放锁,不能获得新锁
事务获得最后加锁的位置成为事务的封锁点
不保证不会发生死锁、级联回滚
级联回滚可以通过严格两阶段封锁协议加以避免:协议要求除了是两阶段封锁协议以外,还要求事务持有的所有排他锁必须在事务提交以后才可释放
强两阶段封锁协议:事务提交前不得释放任何锁。在此条件下,事务可以按其提交的顺序串行化