3

假设我们有以下代码:

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
    }

...并且两个线程正在执行事务,并且读/写按以下顺序发生:

  1. 线程A readTVar1
  2. 线程A读取TVar2
  3. 线程A writeTVar1

  4. 线程B读取TVar1

  5. 线程B读取TVar2
  6. 线程B writeTVar1

  7. 线程A writeTVar2

  8. threadB writeTVar2 --> 冲突!!!

考虑到第 8 步的冲突,我看到解决问题的两种可能性?

可能性1:重试整个事务,即threadB再次执行readTVar1、readTVar2、writeTVar1、writeTVar2

可能性 2:线程 B 回到 readTVar2 并重试readTVar2 和 writeTVar2

那么事务重试是如何发生的呢?

谢谢!

4

0 回答 0