mnesia鎖資料時機

2021-07-25 09:25:36 字數 1691 閱讀 4204

mnesia的鎖,分為讀鎖、寫鎖等,本次總結一下,在乙個事務中,什麼操作會觸發鎖。

做如下實驗:

實驗一:事務中,先讀後寫,讀寫之間又10s中等待;

write(name) ->

fun = fun() ->

= mnesia:read(person, name),

io:format("read ok, name=~p, age=~p~n", [name, age]),

timer:sleep(10000),

mnesia:write()

end,

= mnesia:sync_transaction(fun).

test2() ->

erlang:spawn(?module, write, ["andy"]),

% timer:sleep(1000),

erlang:spawn(?module, write, ["andy"]),

io:format("over!~n"),

timer:sleep(10000),

ok.結論:

1. 讀資料時,會觸發讀鎖

2. 讀鎖不影響程序2的讀表操作

實驗二:事務中,先讀後寫,寫後等待10s,再結束事務;

write(name) ->

fun = fun() ->

= mnesia:read(person, name),

io:format("read ok, name=~p, age=~p~n", [name, age]),

result = mnesia:write(),

timer:sleep(10000),

result

end,

= mnesia:sync_transaction(fun).

test2() ->

erlang:spawn(?module, write, ["andy"]),

timer:sleep(1000),

erlang:spawn(?module, write, ["andy"]),

io:format("over!~n"),

timer:sleep(10000),

ok.結論:

1. 寫資料時,觸發寫鎖,直到事務結束,才會釋放鎖

2. 寫鎖,會延遲程序2的讀表操作

實驗三:修改實驗一的讀表語句,手動修改鎖為寫鎖;

write(name) ->

fun = fun() ->

= mnesia:read(person, name, write),

io:format("read ok, name=~p, age=~p~n", [name, age]),

timer:sleep(10000),

mnesia:write()

end,

= mnesia:sync_transaction(fun).

test2() ->

erlang:spawn(?module, write, ["andy"]),

% timer:sleep(1000),

erlang:spawn(?module, write, ["andy"]),

io:format("over!~n"),

timer:sleep(10000),

ok.結論:

1. 同樣印證了,寫鎖會延遲其他程序的讀寫操作,直到事務結束,才會釋放鎖

MySQL鎖釋放時機 事務

在事務執行過程中,如果有加鎖操作,這個鎖需要等事務提交時釋放。時間線事務1 t1 事務2 t2 t1begin begin t2update lockdemo set state 666 where id 2 t3update lockdemo set state 22 where id 2 t.s...

Erlang資料庫Mnesia操作

mnesia是一套輕量級的軟實時分布式資料儲存系統,支援冗餘複製和事務,特別適合於儲存離散的erlang資料塊,尤其擅長ram中的資料儲存。初始化資料庫步驟 1.啟動節點,erl mensa dir dir name mynode 2.建立資料庫模式,mnesia create schema nod...

mnesia資料庫表的id

對於mnesia資料庫表有時候需要有乙個id欄位,就像關聯式資料庫的主鍵.最簡單的辦法是用uuid做id,但是我們希望此id是整數遞增的.或者用 做id也是不錯的辦法.類似於乙個set集合 意思是集合中不可能兩個相同的鍵同時存在 每個鍵對應的值將作為id,方法mnesia dirty update ...