CMU-15-445笔记(十四)
Transactions
事务包含了一系列的operations,并且不允许部分执行,要么全部执行,要么不执行。想要实现事务一个比较好的方式是用并发来实现,这样每个事务可以独立执行。
Formal Definitions
Database: 是由一系列数据组成
Transaction: 一系列读写操作
Transaction in Sql
事务由 BEGIN开始,然后终止于COMMIT 或者ABORT,如果是commit,那么事务的操作就保存下来了,如果是abort,那么事务的操作会全部回滚。
ACID
Atomicity
原子性就是事务要么全部执行,要么全都不执行。
实现方式
- Loggin
- DBMS记录所有的actions,以便回滚的时候再回复数据
- DBMS会将undo records保存在内存和磁盘中。
- loggin需要在data写入disk之前写入disk
- shadow paging
- 执行事务的时候,复制事务会修改的page,所有修改都在副本上执行,当事务执行完成的时候将page指针指向副本即可。
shadow paging由于会产生磁盘碎片,而由于logging是批量的写入磁盘,所以是顺序写入,所以速度会比shadow paging快
- 执行事务的时候,复制事务会修改的page,所有修改都在副本上执行,当事务执行完成的时候将page指针指向副本即可。
Consistency
有两种一致性,数据库一致性和事务一致性。
Database Consistency
通过完整性约束来保证数据库一致性。
Transaction Consistency
如果数据库在执行事务前是一致性正确的,那么执行事务之后也应当是一致性正确的。
Isolation
隔离性(isolation)指的是不同事务在提交的时候,最终呈现出来的效果是串行的
实现
实现是由concurrency control protocol来实现的,它指挥DBMS来决定执行不同操作的顺序。有两种协议
- Pressimistic(悲观协议)
- 在执行事务前获取lock,来保证问题不会发生
- Optimistic(乐观协议)
- 会假设问题很少发生,所以不会获取lock,当事务提交前会检查是否有问题发生。
例子
假设现在有A,B两个账户,每个账户都有1000元,现在有两个事务
1 | BEGIN |
DBMS不用保证T1和T2的执行顺序,但是不论哪种顺序,最后结果A+B的和应该为2120
当一个事务需要执行IO操作的时候,可以等待它的同时执行另一个事务。
但是如果是另一种情况
就会导致最后数据和期望数据不同
如何保证正确性
Serial Schedule: 不同 transactions 之间没有重叠
Equivalent Schedules: 对于任意数据库起始状态,若两个 schedules 分别执行所到达的数据库最终状态相同,则称这两个 schedules 等价
Serializable Schedule: 如果一个 schedule 与 transactions 之间的某种 serial execution 的效果一致,则称该 schedule 为 serializable schedule
Conflicting
当两个operations满足三个条件的时候,是conflicting operations:
- 来自不同的 transactions
- 对同一个对象操作
- 两个 operations 至少有一个是 write 操作
主要有三种类型:
- Read-Write Conflicts
- Write-Read Conflicts
- Write-Write Conflicts
Read-Write Conflicts
会导致不可重复读的问题
Write-Read Conflicts
会导致脏读
Write-Write Conflicts
会覆盖掉未提交的数据
Conflict Equivalent
Two schedules are said to be conflict equivalent when one can be transformed to another by swapping non-conflicting operations.
Conflict Serializable Schedules
A schedule is called conflict serializable if it can be transformed into a serial schedule by swapping non-conflicting operations.
客观评价,这块视频讲的不太清楚,可以去看geeksforgeesk的讲解
判断是否是Conflict Serializable,可以通过交换non-conflicting operations的执行顺序后,看是否和Serial Schedule结果相同
这可以说明是Conflict Serializablilty的
这个就不是
Dependency Graphs
一种更方便的方式是构建依赖图,如果图没有环路,那么说明是conflict serializable的。
图的边的意思是在事务Ti和事务Tj中,操作Oi(来自Ti)与Oj(来自Tj)冲突,并且Oi比Oj出现的早,那么就建立一条Ti到Tj的边
如果有环路,就说明不是conflict serializable
没有环路就是conflict serializable
View Serilizability
View Serilizability是一种更弱的Serilizability,它不保证conflict serializable,但是保证最后结果是和serializable一致的。
Serializability
Conflict Serialization是基本所有数据库都支持的,但是View Serilizability现在不常见
这是Schedules的总览图
Durability
所有的事务提交后的信息都应该是持久的,DBMS可以使用logging或者shadow page来确保这一点。
CMU-15-445笔记(十四)