ets 可以找到该记录,但不能删除它

问题描述 投票:0回答:1

我有一个简单的问题。

ets:lookup()
可以找到记录,但
ets:delete()
给出
badarg
错误。

case ets:lookup(Connections, Next) of
    [] ->
         case ets:lookup(Connections, Prev) of
             [{Network, Node, Address}]->
                  print_ets_table(Connections),
                  ets:delete(Connections, Network), -> this gives error
                  ets:insert(Connections, {Next, Node, Address}),
                  Next;
             _ ->
                  % Report
                  Prev
                  end;
    _ ->
        % Report
          Prev
         end;

print_ets_table(连接):

[{<<134,176,18,190,115,242,102,213>>,
  {sslsocket,{gen_tcp,#Port<0.6>,tls_connection,
                      [{option_tracker,<0.110.0>},
                       {session_tickets_tracker,disabled},
                       {session_id_tracker,<0.111.0>}]},
             [<0.114.0>,<0.113.0>]},
  <<127,0,0,1>>}]

和错误

{badarg,[{ets,delete,
              [#Ref<0.3551319967.1683357697.51087>,
               <<134,176,18,190,115,242,102,213>>],
              [{error_info,#{cause => access,module => erl_stdlib_errors}}]}

Network
是二进制类型数据并且 这就是表的定义方式

Connections = ets:new(connections, [set])

我阅读了 ets 文档并询问 GPT 但找不到解决方案

erlang elixir in-memory-database ets
1个回答
0
投票

默认情况下,

ets:new/2
创建一个受保护的表,这意味着所有者进程可以读写该表,但其他进程只能读取它。如果您希望任何进程都能够删除表条目,您可以将表公开:

ets:new(connections, [set, public]).
© www.soinside.com 2019 - 2024. All rights reserved.