“原始”脏操作和 mnesia:async_transaction 中的脏操作有什么区别

Jr0*_*Jr0 5 erlang mnesia

在传递给 mnesia:async_dirty() 的函数中执行的一系列 mnesia:dirty_ 命令与那些“原始”执行的完全相同的事务之间有什么区别?

即,这样做有什么区别:

mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1})
Run Code Online (Sandbox Code Playgroud)

F = fun() ->
        mnesia:dirty_write({table, Rec1}),
        mnesia:dirty_write({table, Rec1}),
        mnesia:dirty_write({table, Rec1})
   end,

   mnesia:async_dirty(F)
Run Code Online (Sandbox Code Playgroud)

谢谢

Muz*_*hua 0

让我们首先引用用户指南的上下文async_dirty

通过将相同的“fun”作为参数传递给函数
mnesia:async_dirty(Fun [, Args]) ,它将在脏上下文中执行。
函数调用将被映射相应的脏函数
这仍然涉及日志记录、复制和订阅,但不会涉及
锁定、本地事务存储或提交协议。检查点
保留器将被更新,但将被更新为“脏”。因此,它们将
异步更新。这些函数将等待在一个节点上执行操作
,而不是在其他节点上执行。如果表驻留在本地,则不会发生等待。

您提供的两个选项将以相同的方式执行。然而,当您执行选项一中的脏函数时fun,每个函数都是对 mnesia 的单独调用。使用async_dirty,这 3 个调用将被捆绑在一起,并且 mnesia 只会等到这 3 个调用在本地节点上完成才返回。
然而,这两者的行为在 mnesia 多节点集群中可能有所不同。做一些测试:)