Erlang:Mnesia:连续更新单个字段值

ErJ*_*Jab 7 database erlang mnesia

我有一个mnesia表,有三个字段,i,a和b,使用记录创建

-record(rec, {i, a,b}).
Run Code Online (Sandbox Code Playgroud)

现在我在表中插入一行:

mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=2, b=3}, write) end ).
Run Code Online (Sandbox Code Playgroud)

现在,如果我想要更新此行,并且仅将a的值更改为10,同时使i和b保持相同的值,我该怎么办?是否有像" UPDATE T SET a=10 WHERE i=1" 这样的SQL等价物?

如果我做这样的事情:

mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=10}, write) end )
Run Code Online (Sandbox Code Playgroud)

该行存储为:

{rec,1,10,undefined}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ian 9

如果在mnesia:transaction中使用,则此函数的值将更新

update_a(Tab, Key, Value) ->
  fun() ->
    [P] = mnesia:wread({Tab, Key}),
    mnesia:write(P#pixel{a=Value})
  end.
Run Code Online (Sandbox Code Playgroud)

建议:如果你想要一些更像SQL语法的语法糖,请查看QLC.

性能当然是最佳基准测试,但QLC有开销,我不确定它们与其他细节相比是否相关.我只是想你所提供的SQL示例将更新所有记录i=1.使用QLC提取该组记录比mnesia调用更漂亮.

还要注意,wread直接声明对记录的写锁定,因为我们提前知道我们将更新该记录.这是一个微优化,以避免首先读取锁定,然后改变主意并获得写入锁定.我在很长一段时间内没有对此进行过基准测试.

如果性能仍然是一个问题,您应该查看使用脏操作的各种方法.但是你真的应该试着弄清楚你需要每秒多少交易才能"足够快".