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 ...