2

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

尤其:

  1. 另一个进程会在什么状态下看到有向图,如果另一个进程试图在 del_vertex 中间访问它(vertices()、out_neighbours() 等):在 del_vertex 之前,在 del_vertex 中间(即顶点被删除,边没有或边缘被删除,顶点不被删除)还是在 del_vertex 之后(即另一个进程将被阻塞直到操作结束)?
  2. 关于 del_vertices 的相同问题。

如果我理解正确,有向图是使用 3 个 ets 表实现的。它们之间是否有任何额外的锁定机制以使结果保持一致?

4

1 回答 1

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

于 2011-04-03T18:17:58.213 回答