有没有在任何地方描述有向图原子性和隔离保证?
特别是:
如果我理解正确,则使用3个ets表实现有向图。它们之间是否有任何额外的锁定机制,以使结果保持一致?
答案 0 :(得分:4)
看看digraph.erl的来源我看不到额外的锁定。
del_vertex(G, V) ->
do_del_vertex(V, G).
...
do_del_vertex(V, G) ->
do_del_nedges(ets:lookup(G#digraph.ntab, {in, V}), G),
do_del_nedges(ets:lookup(G#digraph.ntab, {out, V}), G),
ets:delete(G#digraph.vtab, V).
因此,当您从另一个过程中查看有向图时,您将看到以下状态,具体取决于时间:
del_vertex/2
del_vertices/2
的顶点之后的顶点也是如此。
如果你想要更多原子性,请创建有向图protected
并将其包装到自己的服务器中,例如gen_server
通常实现需要密切访问有向图的功能的一部分。