[erlang-questions] mnesia:dirty_update_counter and replicated tables

Vance Shipley <>
Thu Sep 21 21:00:38 CEST 2006


On Thu, Sep 21, 2006 at 02:10:22AM -0500, Scott Lystig Fritchie wrote:
}  There hasn't been any discussion of mnesia:dirty_update_counter here
}  in quite a while.

Well since you've brought it up ...

In ETS update_counter/3 is implemented as:

   update_counter(Tab, Key, {Pos,Incr,Threshold,SetValue}) -> Result
   update_counter(Tab, Key, {Pos,Incr}) -> Result
   update_counter(Tab, Key, Incr) -> Result

You can atomically update a wrap around counter.  E.g.:

	ets:update_counter(tid, {2,1,16#ffffffff,0})

This maintains a 16 bit counter.

In mnesia the wrap around functionality is missing:

   dirty_update_counter(Tab, Key, Incr) -> NewVal | exit({aborted, Reason}) 

So whereas I'd like to do:

   mnesia:dirty_update_counter(counters,transactionID,{2,1,16#ffffffff,0})

Instead I have to do:

   Fun = fun() ->
            [C] = mnesia:read(counters, transactionID, write),
            LocalTID = (C#counters.val + 1) rem 16#ffffffff,
            mnesia:write(counters, C#counters{val = LocalTID}, write),
            LocalTID
   end,
   {atomic, LocalTID} = mnesia:transaction(Fun),

... which may be safer but for a simple counter unecessary.

	-Vance



More information about the erlang-questions mailing list