我们有以下代码:
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
}
...两个线程正在执行事务,读/写按以下顺序发生:
threadA writeTVar1
threadB readTVar1
threadB writeTVar1
threadA writeTVar2
考虑到步骤8中的冲突,我看到两种解决问题的可能性?
可能性1:重试整个事务,即threadB再次执行readTVar1,readTVar2,writeTVar1,writeTVar2
可能性2:threadB返回readTVar2并重试 readTVar2和writeTVar2
那么交易重试是如何发生的呢?
谢谢!