[erlang-questions] ets:select_delete not atomic?
Sverker Eriksson
sverker@REDACTED
Mon Aug 12 16:33:44 CEST 2019
On mån, 2019-08-12 at 14:16 +0200, Oliver Bollmann wrote:
> Hi,
>
> EtsName = ets:new(test,[named_table,ordered_set]),
> Res = ets:select_delete(EtsName,[{{Key},[],[true]}]).
>
> Res should be 1 or 0!
>
> But if i do this with a lot of process, at the same time,
> it happend that two process get 1!
>
> Start with: ets:insert(EtsName,{Key}).
>
> Process One: ets:select_delete(EtsName,[{{Key},[],[true]}]).
> Process Two: ets:select_delete(EtsName,[{{Key},[],[true]}]).
>
> Process One get 1 AND Process Two get 1, with the same key, of course!
>
>
> Is this correct?
>
No, that does not seem right.
The table traversals done by ets:select* and ets:match* functions are not
atomic, but the operation done on each found object should be atomic.
That is, if you do ets:insert(T,{Key}) once and then several
ets:select_delete(T, [{{Key},[],[true]}]) in parallel, only of of them should
find {Key} and delete it.
What OTP version is this?
/Sverker
More information about the erlang-questions
mailing list