ETS批量操作是原子的吗?

时间:2017-07-31 02:49:09

标签: erlang ets

具体而言,:ets.tab2list:ets.file2tab。这些函数是否“快照”了表状态,还是其他操作可以在这些函数完成时交错读取和写入?

1 个答案:

答案 0 :(得分:2)

基于文档here

  

内部遍历表格的函数(如selectmatch)提供与safe_fixtable相同的保证。

其中

  

[...]函数safe_fixtable可用于保证first / 1和next / 2调用序列无错误地遍历表,并且表中的每个现有对象只被访问一次,甚至如果另一个(或相同的)进程同时删除或插入表中的对象。

特别与您的问题相关:

  

没有其他保证;特别是在这种遍历期间插入或删除的对象可以访问一次或根本不访问。

编辑

ets:tab2list/1调用ets:match_object/2这是一个用C实现的内置函数(BIF)。实现here正在使用BIF ets_select2,这是一个实现ets:select/2

ets:file2tab最终会调用load_table/3,只使用ets:insert/2

ets.erlets:tab2file/3的代码,使用ets:select/3获取第一个块,然后使用ets:select/1获取表中的其余块。