mnesia:delect_object只删除索引问题

简介: 前言最近遇到一个奇怪的问题,mnesia数据有时能查出来有时查不出来,细查发现是mnesia:delect_object删除时,只删除了索引,没有删除具体的数据问题重现表结构:-record(gordon_test, {idr, % {id, pid}id,pid,locale,time = os:timestamp()}).

前言

最近遇到一个奇怪的问题,mnesia数据有时能查出来有时查不出来,细查发现是mnesia:delect_object删除时,只删除了索引,没有删除具体的数据

问题重现

  1. 表结构:

    -record(gordon_test, {

    idr, % {id, pid}
    id,
    pid,
    locale,
    time = os:timestamp()

    }).
    
  2. 初使化代码:

    mnesia:create_table(gordon_test, [

    {ram_copies, [node() | nodes()]},
    {attributes, record_info(fields, gordon_test)}

    ]),
    mnesia:add_table_index(gordon_test, id),
    mnesia:add_table_index(gordon_test, pid).
    
  3. 插入数据:

    mnesia:dirty_write(gordon_test, {gordon_test, {1, 1}, 1, 1, "", "", os:timestamp()}).
    mnesia:dirty_write(gordon_test, {gordon_test, {2, 2}, 2, 2, "", "", os:timestamp()}).
    mnesia:dirty_write(gordon_test, {gordon_test, {3, 3}, 3, 3, "", "", os:timestamp()}).
    

3.查询:

Id = 3,
Pid = 3,
% 查出id=3的所有记录,都能查出一条记录
mnesia:dirty_index_read(gordon_test, Id, #gordon_test.id),
mnesia:dirty_index_match_object(#gordon_test{idr = '$1',id=Id, _='_'}, #gordon_test.id),
  1. 执行删除:

    mnesia:dirty_delete_object(X#gordon_test{locale = aaaa}).
    or
    Trans = fun() ->
        mnesia:delete_object(X#gordon_test{locale = aaaa})
            end,
    mnesia:transaction(Trans)
    
  2. 两次查询,dirty_index_read查不到数据:

    % 数据查询为空
    mnesia:dirty_index_read(gordon_test, Id, #gordon_test.id),
    % 数据不变
    mnesia:dirty_index_match_object(#gordon_test{idr = '$1',id=Id, _='_'}, #gordon_test.id),
    

问题定位

查文档:

If a table is of type bag, it can sometimes be needed to delete only some of the records with a certain key. This can be done with the function delete_object/3. A complete record must be supplied to this function.

The semantics of this function is context-sensitive. For details, see mnesia:activity/4. In transaction-context, it acquires a lock of type LockKind on the record. Currently, the lock types write and sticky_write are supported.

深层研究

待继续 @todo

目录
相关文章
|
4月前
|
JSON 数据格式 C++
使用NlohmannJson写JSON保留插入顺序
使用NlohmannJson写JSON保留插入顺序
146 0
|
5月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
【TS】关于v-for数组对象遍历以及在页面上使用提示object类型的问题解决
【TS】关于v-for数组对象遍历以及在页面上使用提示object类型的问题解决
200 0
|
存储 算法 索引
返回索引
返回索引
73 0
|
人工智能
ES中更新字段和删除字段的操作
ES中更新字段和删除字段的操作
|
消息中间件 NoSQL Redis
数据类型-list 扩展操作删除数据
快速学习数据类型-list 扩展操作删除数据
list.remove(index)返回flase,移除失败
list.remove(index)返回flase,移除失败
123 0
list.remove(index)返回flase,移除失败
使用 some , every ,和 Object.values 检查对象内的值
使用 some , every ,和 Object.values 检查对象内的值
168 0
使用 some , every ,和 Object.values 检查对象内的值
|
存储 Java
Class文件结构介绍[字段表集合和方法表集合]
字段表(field_info)用来描述接口或类中声明的变量,字段包括类级别变量以及实例级别变量。但不包括方法内部声明的局部变量。以如下代码来分析
Class文件结构介绍[字段表集合和方法表集合]
往对象数组里面添加相同的key 不同的value 和删除相同的key值
往对象数组里面添加相同的key 不同的value 和删除相同的key值