zoukankan      html  css  js  c++  java
  • mnesia的脏读和事物读的测试

    在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直接操作。

  • 相关阅读:
    python+appium真机运行登录例子
    通过aapt查看apk包名和第一个启动的activity
    cf 17D Notepad 欧拉降幂
    主席树入门
    D2. Optimal Subsequences (Hard Version) 主席树
    cf 697C Lorenzo Von Matterhorn 思维
    2018南京现场赛K 随机输出
    2018徐州现场赛A
    洛谷p1137 模拟退火
    2018南京现场赛D 模拟退火
  • 原文地址:https://www.cnblogs.com/unqiang/p/4424876.html
Copyright © 2011-2022 走看看