[erlang-questions] mnesia:dirty_update_counter and replicated tables
Serge Aleynikov
serge@REDACTED
Thu Sep 21 18:33:18 CEST 2006
Uffe,
You highlighted an interesting point of wrapping "dirty" operations in
transactions. I haven't thought of this possibility, always perceiving
"dirty" operations being orthogonal to transaction-based operations.
Is there ever a point of using "dirty" updates inside transactions?
Serge
Ulf Wiger (TN/EAB) wrote:
> Even though this problem would seem to be addressed by
> wrapping dirty_update_counter inside a transaction:
>
> mnesia:activity(
> transaction,
> fun() ->
> mnesia:write_lock_table(Tab),
> mnesia:dirty_update_counter({Tab, Key}, Incr)
> end).
>
> It _still_ wouldn't be safe, for the following reasons:
>
> - Dirty updates within a transaction are not recognized
> as updates per se. So there will be failure situations
> were the update may not propagate consistently to all
> replicas.
> - Since the dirty update cannot be undone, and mnesia
> reserves the right to re-run transactions in the name
> of deadlock prevention, you are not guaranteed that
> the update will happen only once.
> - If your transaction aborts, the update_counter will
> not be rolled back, if it had time to execute before
> the abort, which you have no way of knowing (unless
> you add some additional dirty stuff).
>
> BR,
> Ulf W
>
> Serge Aleynikov wrote:
>> Scott,
>>
>> The answer is regretfully no. Let's consider an example to
>> illustrate this point. You have two nodes A and B both
>> running mnesia with a replicated table.
>>
>> 1. The content of a counter is 1.
>> 2. Node A does a mnesia:dirty_update_counter call to
>> increment the value of the counter by 2.
>> 3. Very closely in time node B does
>> mnesia:dirty_update_counter call to increment the counter by 3.
>>
>> After this the value of that field could be either one of:
>>
>> a) 3.
>> b) 4.
>> c) 6.
>>
>> No guarantees can be made as to which value the counter would
>> hold without having cross-node locking involved by using transactions.
>>
>> Depending on the application you could use transactions to
>> update data and dirty operations for read-only purposes.
--
Serge Aleynikov
R&D Telecom, MIS, IDT Corp
Tel: +1 (973) 438-3436
Fax: +1 (973) 438-1464
More information about the erlang-questions
mailing list