【问题标题】:Erlang digraph atomicity and isolation guaranteesErlang digraph 原子性和隔离性保证
【发布时间】:2011-07-28 08:52:07
【问题描述】:

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

特别是:

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

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

【问题讨论】:

  • 顺便说一句:您有两个不相交的帐户,一个信誉为 11,这个信誉为 6。如果您想在不同的计算机上使用 SO,您应该考虑注册。

标签: erlang atomic directed-graph isolation


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多