Skip to content

Latest commit

 

History

History
33 lines (17 loc) · 2.16 KB

9.timestamp.md

File metadata and controls

33 lines (17 loc) · 2.16 KB

5.8 时间戳

锁是一种比较悲观的并发控制逻辑,在某些情况下,锁并不合适。因此我们也引入一些比较乐观的并发控制逻辑,比如时间戳。

如果每个事务开启的时候,系统可以记录这个事务开启的时间 TS(Ti),记为事务 Ti 的时间,通过比较不同事务的时间戳,给事务排序。

img

时间戳不一定是一种严格意义上的时间戳,主流数据库都是通过事务管理器(保证事务的时间戳不会一致)进行时间戳的管理,获取时间戳一般是通过一个调度器进行申请,调度器往往是单线程的,保证两个事务的时间戳不会出现相同的情况。

同样,时间戳也有类别,规定了两种对数据的时间戳,分别是数据 A 读时间戳和写时间戳,具体解释如下所示。

1)W-timestamp(A):记录对于数据 A,最近一次被某个事务修改的时间戳。

2)R-timestamp(A):记录对于数据 A,最近一次被某个事务读取的时间戳。

  • 对于事务 Ti 要读取数据 A read(A):

    1. 如果 TS(Ti) < W-timestamp(A),A 被一个新的事务改写了,Ti 会被回滚。

    2. 如果 TS(Ti) > W-timestamp(A),说明 A 最近一次被修改小于 TS(Ti),因此读取成功,并且 R-timestamp(A) 被改写为 TS(Ti)。

  • 对于事务 Ti 要修改数据 A write(A):

    1. 如果 TS(Ti) < R-timestamp(A),说明 A 已经被一个更大 TS 的事务读取了,Ti 对 A 的修改就没有意义了,因此 Ti 的修改请求会被拒绝,Ti 会被回滚。

    2. 如果 TS(Ti) < W-timestamp(A),说明 A 已经被一个更大 TS 的事务修改了,Ti 对 A 的修改也没有意义了,因此 Ti 的修改请求会被拒绝,Ti 会被回滚。

    3. 其他情况下,Ti 的修改会被接受,同时 W-timestamp(A) 会被改写为 TS(Ti)。

接下来看一个合理的时间戳调度机制示例,如下图所示。

img