mnesia的脏读和事物读的测试

本文通过代码实例展示了Mnesia数据库中脏读与事物读的性能差异,发现脏读速度明显快于事物读,且获取结果单位为微秒。深入追踪源码发现,脏读操作直接通过ets进行,而事物读则通过mnesia进行事务管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在mnesia中,有脏读脏写等以及事物读写,它们的差异通过测试不难发现:

代码如下:

-module(mnesia_read_test).

-compile(export_all).

-record(r_test, {id, name}).
 
start(N) ->
    timer:tc(mnesia_read_test,dirty_read,[N]).

start2(Num) ->
    timer:tc(mnesia_read_test,t_read,[Num]).

init() ->
    case mnesia:create_schema([node()]) of
        ok ->
            ok;
        _ ->
            mnesia:delete_schema([node()]),
            mnesia:create_schema([node()])
    end, 
    mnesia:start(),
 
    case mnesia:create_table(r_test, [{attributes, record_info(fields, r_test)},
                                      {record_name, r_test},{disc_copies, [node()]}]) of
               {atomic, ok} ->
                                    ok;
                _Any1 ->
                            mnesia:delete_table(r_test),
                            mnesia:create_table(r_test, [{attributes, record_info(fields, r_test)},
                                      {record_name, r_test},{disc_copies, [node()]}])
    end,
        
        mnesia:transaction(fun() -> t_write(10000) end).

        t_write(0) ->
                    ok;
        t_write(N) ->
                    Name = lists:append(["name_", N]),
                    R = #r_test{id=N, name=Name},
                    mnesia:write(R),
                    t_write(N-1).

dirty_read(0) ->
    ok;
dirty_read(Num) ->
    mnesia:dirty_read(r_test, Num),
    dirty_read(Num-1).
 
 
t_read(0) ->
        ok;
t_read(Num) ->
        mnesia:transaction( fun() -> mnesia:read(r_test, Num) end),
        t_read(Num-1).
 
View Code

%%这里创建的表类型为:disc_copies

{disc_copies,NodeList} NodeList每个节点都有内存备份和磁盘备份

测试结果如下:

不难发现,脏读比事物读快了至少1个——2个数量级,获取的结果为微秒(1秒 = 1000000微秒)

从mnesia.erl 追踪脏读源码到mnesia_lib.erl中:

db_get(TabKey) ->

    db_get(val({Tab, storage_type}), TabKey).

db_get(ram_copies, TabKey) -> ?ets_lookup(TabKey);

db_get(disc_copies, TabKey) -> ?ets_lookup(TabKey);

db_get(disc_only_copies, TabKey) -> dets:lookup(TabKey).

发现是ets直接操作。

 

转载于:https://www.cnblogs.com/unqiang/p/4424876.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值