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

目录
相关文章
把list转为List<clazz>类型,并把字典项转为字典值
把list转为List<clazz>类型,并把字典项转为字典值
|
存储 算法 索引
返回索引
返回索引
62 0
list.remove(index)返回flase,移除失败
list.remove(index)返回flase,移除失败
114 0
list.remove(index)返回flase,移除失败
使用 some , every ,和 Object.values 检查对象内的值
使用 some , every ,和 Object.values 检查对象内的值
165 0
使用 some , every ,和 Object.values 检查对象内的值
|
索引
索引分类、创建索引、删除索引
索引分类、创建索引、删除索引
137 0
索引分类、创建索引、删除索引
|
关系型数据库 MySQL 数据库
创建索引,这些知识应该了解
在 MySQL 中,基本上每个表都会有索引,有时候也需要根据不同的业务场景添加不同的索引。索引的建立对于数据库高效运行是很重要的,本篇文章将介绍下创建索引相关知识及注意事项。
144 0
往对象数组里面添加相同的key 不同的value 和删除相同的key值
往对象数组里面添加相同的key 不同的value 和删除相同的key值
|
存储 Java
Class文件结构介绍[字段表集合和方法表集合]
字段表(field_info)用来描述接口或类中声明的变量,字段包括类级别变量以及实例级别变量。但不包括方法内部声明的局部变量。以如下代码来分析
Class文件结构介绍[字段表集合和方法表集合]
Object.create()方法与new操作的区别
Object.create()方法与new操作的区别
147 0
Object.create()方法与new操作的区别
|
关系型数据库 索引 存储
覆盖索引 covering index
覆盖索引定义 应用场景 测试
2537 0