Transactions 已复制表上的异步\u脏

Transactions 已复制表上的异步\u脏,transactions,erlang,mnesia,Transactions,Erlang,Mnesia,假设我有一个Mnesia表T,它保存{T,Key,Value},在两个节点a和B上复制,dirty_write定义为: dirty_write(T, Tuple) -> Fun = fun() -> mnesia:write(T, Tuple, write) end, mnesia:activity(async_dirty, Fun, [], SomeMod). R1={T,1,2},R2={T,1,3}是两个

假设我有一个Mnesia表T,它保存{T,Key,Value},在两个节点a和B上复制,dirty_write定义为:

dirty_write(T, Tuple) ->
    Fun = fun() ->
                  mnesia:write(T, Tuple, write)
          end,
    mnesia:activity(async_dirty, Fun, [], SomeMod).
R1={T,1,2},R2={T,1,3}是两个记录,如果我同时执行:

dirty_write(T, R1) %% on node A
dirty_write(T, R2) %% on node B
这会在T上引入某种不一致/错误吗?

我发现您的记录R1={1,2},R2={1,3}有点非常规,因为mnesia约定会使R1={T,1,2},R2={T,1,3}更常见,但实际上对于回调模块的适当实现来说并不一定是功能失调的。尽管如此,您的代码可能不是其他Erlang开发人员所期望的

对于您提供的示例,当然不清楚关键点是什么,但最合理的猜测可能是“记录”的第一个元素,在本例中为1。这意味着您要在两个节点上更新相同的记录

在这种情况下,我认为没有理由因为这两项交易本身而产生任何不一致的风险;您的表不存在包含任何实际无效内容的风险,但当然其中一个会覆盖另一个,而且两个编写器都不知道哪一个会赢。也许如果你觉得你想用这种方式做一个异步脏写,那么我希望你已经决定不管哪一个赢了

然而。。。读取或以其他方式使用您正在更新的记录的其他事务/操作可能会访问已写入记录的任何一个值,或在写入记录之前使用该值,然后执行已执行的任何操作。。。因此,问题是,它完全依赖于用例,任何其他事务性操作是否会受到这种不确定性水平的不利影响。这里的主要风险是,例如,一些其他的记录可能是在记录{T,1,2}的基础上写的,但是当所有的说和做的时候,实际上是{T,2,3}占了上风。。。这对于您的应用程序可能是也可能不是,这可能是也可能不是一个问题

mnesia提供不同级别的安全性和性能的原因在于异步脏、同步脏和完全同步事务,这是因为只有最终开发人员/集成商有足够的知识来决定需要什么样的安全性和性能