[erlang-questions] Why is Mnesia read-locking an entire table?

Jim jrosenblum@REDACTED
Sat Nov 3 18:53:46 CET 2012


Is there an alternative that would avoid this in my two uses of select below? Would qlc avoid the table lock?

Sent from my iPhone

On Nov 3, 2012, at 1:49 PM, Dan Gudmundsson <dangud@REDACTED> wrote:

> Mnesia grabs locks before the actual operation is performed,
> a select call thus requires a table lock since mnesia does not analyse
> the select expression.
> 
> /Dan
> 
> On Sat, Nov 3, 2012 at 2:32 PM, Jim <jrosenblum@REDACTED> wrote:
>> Dear List
>> 
>> I am having trouble understanding why Mnesia is grabbing a read-lock on an
>> entire table. Can someone give me any insight?
>> 
>> Here are some facts (beliefs ;)
>> 
>> * The table is of type ordered_set
>> * My key is a two-tuple,  {unix-style-milliseconds-since-1970, Key} as in,
>> {1351872742126278,"BI13626"}},
>> * There are two additional indexed columns
>> *  I am frequently, in the same transaction, deleting and inserting two
>> records which differ *only* in the time-stamp portion of the key – I am
>> replacing an older version of the record with a newer version
>> * All access is done within a function that is passed to
>> mnesia:transaction/1
>> * All access to the table in question is via:
>>    o   mnesia:index_read/3 where all three variables being passed in are
>> *always* bound,  or
>>    o   mnesia:select/2 as shown below
>> 
>> 
>> lookup_since(Since) ->
>>    M = [{#key_to_value{update_map={'$1', '_'}, _='_'},
>>    [{'>', '$1', Since}], ['$_']}]
>>   {ok, mnesia:select(key_to_value, M)}.
>> 
>> or
>> 
>> lookup_keylist(Keys, Since) ->
>>   M = [{#key_to_value{update_map={'$1', K}, _='_'},
>>          [{'>', '$1', Since}],  ['$_']} || K <- Keys],
>>    {ok, mnesia:select(key_to_value, M)}.
>> 
>> Mnesia:info reports the following
>> 
>> 
>> 
>> Lock: {{key_to_value,'______WHOLETABLE_____'},read,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872742126278,"BI13626"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872742130724,"BI13623"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872742136170,"BI13621"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872742140957,"BI13616"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872746638841,"BI13628"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872746640989,"BI13626"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872746642481,"BI13623"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872746643406,"BI13621"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872746644468,"BI13616"}},write,{tid,247,<0.1717.0>}}
>> 
>> Lock: {{scope_to_keys,"6B-PED"},write,{tid,247,<0.1717.0>}}
>> 
>> Lock: {{scope_to_keys,"InPatient"},write,{tid,247,<0.1717.0>}}
>> 
>> Lock: {{type_to_keys,"b_index"},write,{tid,247,<0.1717.0>}}
>> 
>> ---> Processes waiting for locks <---
>> 
>> ---> Participant transactions <---
>> 
>> ---> Coordinator transactions <---
>> 
>> Tid: 247 (owned by <0.1717.0>)
>> 
>> ---> Uncertain transactions <---
>> 
>> 
>> 
>> 
>> 
>> Here is a second example of the mnesia:info() output
>> 
>> 
>> 
>> ---> Processes holding locks <---
>> 
>> Lock: {{key_to_value,'______WHOLETABLE_____'},read,{tid,707,<0.1876.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872861465784,"VI14543"}},write,{tid,707,<0.1876.0>}}
>> 
>> Lock:
>> {{key_to_value,{1351872868375564,"VI14543"}},write,{tid,707,<0.1876.0>}}
>> 
>> ---> Processes waiting for locks <---
>> 
>> ---> Participant transactions <---
>> 
>> ---> Coordinator transactions <---
>> 
>> Tid: 707 (owned by <0.1876.0>)
>> 
>> ---> Uncertain transactions <---
>> 
>> Any help would be greatly appreciated,
>> Jr0
>> 
>> 
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>> 



More information about the erlang-questions mailing list