FSharpx.Stm如何处理冲突?

时间:2014-05-08 01:38:24

标签: f# stm

我们有以下代码:

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. threadA readTVar1
  2. threadA readTVar2
  3. threadA writeTVar1

  4. threadB readTVar1

  5. threadB readTVar2
  6. threadB writeTVar1

  7. threadA writeTVar2

  8. threadB writeTVar2 - >冲突!!!!
  9. 考虑到步骤8中的冲突,我看到两种解决问题的可能性?

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

    可能性2:threadB返回readTVar2并重试 readTVar2和writeTVar2

    那么交易重试是如何发生的呢?

    谢谢!

0 个答案:

没有答案