Erlang有向图原子性和隔离保证

时间:2011-04-02 19:04:33

标签: erlang atomicity directed-graph isolation

有没有在任何地方描述有向图原子性和隔离保证?

特别是:

  1. 另一个进程看到有向图的状态,如果另一个进程试图在del_vertex中间访问它(vertices(),out_neighbours()等):在del_vertex之前,在del_vertex的中间(即顶点被删除,边缘)不是或删除边,顶点不是)或在del_vertex之后(即在操作结束之前另一个进程将被阻止)?
  2. 关于del_vertices的相同问题。
  3. 如果我理解正确,则使用3个ets表实现有向图。它们之间是否有任何额外的锁定机制,以使结果保持一致?

1 个答案:

答案 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通常实现需要密切访问有向图的功能的一部分。