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快

Consistency

有两种一致性,数据库一致性和事务一致性。

Database Consistency

通过完整性约束来保证数据库一致性。

Transaction Consistency

如果数据库在执行事务前是一致性正确的,那么执行事务之后也应当是一致性正确的。

Isolation

隔离性(isolation)指的是不同事务在提交的时候,最终呈现出来的效果是串行的

实现

实现是由concurrency control protocol来实现的,它指挥DBMS来决定执行不同操作的顺序。有两种协议

  • Pressimistic(悲观协议)
    • 在执行事务前获取lock,来保证问题不会发生
  • Optimistic(乐观协议)
    • 会假设问题很少发生,所以不会获取lock,当事务提交前会检查是否有问题发生。

例子

假设现在有A,B两个账户,每个账户都有1000元,现在有两个事务

1
2
3
4
5
6
7
8
9
BEGIN
A = A - 100
B = B + 100
COMMIT

BEGIN
A = A * 1.06
B = B * 1.06
COMMIT

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来确保这一点。

作者

xiaomaotou31

发布于

2022-05-22

更新于

2022-05-30

许可协议

评论