假设我们有以下代码:
let tv1 = newTVar 1
let tv2 = newTVar 2
let transaction =
stm {
let! v1 = readTVar tv1
let! v2 = readTVar tv2
let newV1 = v1 + v2
let newV2 = 2 * newV1
do! writeTVar tv1 newV1
do! writeTVar tv2 newV2
}
...并且两个线程正在执行事务,并且读/写按以下顺序发生:
- 线程A readTVar1
- 线程A读取TVar2
线程A writeTVar1
线程B读取TVar1
- 线程B读取TVar2
线程B writeTVar1
线程A writeTVar2
- threadB writeTVar2 --> 冲突!!!
考虑到第 8 步的冲突,我看到解决问题的两种可能性?
可能性1:重试整个事务,即threadB再次执行readTVar1、readTVar2、writeTVar1、writeTVar2
可能性 2:线程 B 回到 readTVar2 并仅重试readTVar2 和 writeTVar2
那么事务重试是如何发生的呢?
谢谢!