代码:
object Blub {
import scala.concurrent.stm._
val last = Ref("none")
def bla() = atomic { implicit txn =>
last() = "outer"
try {
atomic { implicit txn =>
last() = "inner"
println(last())
throw new RuntimeException
}
} catch {
case _: RuntimeException =>
}
}
def main(args: Array[String]): Unit = {
bla()
println("Result: "+last.single())
}
}
输出:
inner
inner
Result: outer
谁能解释为什么内部原子块运行两次?我知道由于异常,它会回滚,因此最终结果。但是我不明白为什么它第二次运行代码。
答案 0 :(得分:4)
ScalaSTM文档中this page的底部是这样的:
为使嵌套非常便宜,ScalaSTM尝试将所有 将级别嵌套在一起,成为一个顶级事务。如果 内部交易引发异常,那么还不够 信息以执行部分回滚,因此ScalaSTM重新启动 以完全嵌套的模式进行整个交易。这个 优化称为包容。
那么会发生什么:
last
设置为"outer"
last
设置为"inner"
"inner"
已打印last
现在又回到了"none"
)并重试了“非-flattened” last
设置为"outer"
last
设置为"inner"
"inner
已打印last
设置回"outer"
。