Лучшее понимание того, как работать/сбалансировать транзакционные/ACID-возможности mnesia.

Я все еще пытаюсь глубоко понять, что можно сделать с Mnesia, и ответы на эти два вопроса очень помогли бы.

1) Что произойдет, если один процесс выполнит атомарную транзакцию в отношении записи X, а какой-то другой процесс выполнит грязную транзакцию с той же записью. Скомпрометированы ли свойства ACID первых процессов?

2) Есть ли способ, которым один и тот же процесс удерживает не грязную (mnesia:transaction/1) блокировку чтения в одной строке таблицы, одновременно выполняя грязную операцию в другой таблице?


person Jr0    schedule 08.11.2012    source источник


Ответы (1)


Гарантии изоляции теряются в среде базы данных, допускающей грязные операции, как это делает Mnesia. Таким образом, ответ на вопрос 1) — да, корректный транзакционный процесс потенциально скомпрометирован одновременной грязной операцией, и наоборот — грязное чтение, например, может вернуть «старые» или даже недавно удаленные данные, в то время как опасность, присущая грязные записи очевидны.

Во втором сценарии ответ положительный по двум причинам: заблокирован только объект данных, который вы читаете, И при этом только ваша локальная копия! Что, как правило, прекрасно и полезно, и позволяет выполнять даже параллельные транзакции с другими объектами данных (включая, конечно, другие таблицы).

Документация по Erlang Mnesia, глава 4

person snwight    schedule 10.11.2012
comment
Что касается № 2, как? Я хочу, чтобы один и тот же процесс имел trx на одном столе, а на втором выполнял грязный trx. Транзакция выполняется с помощью функции, переданной в mnesia:transaction/1, так как же мне одновременно получить грязный trx? Если я их вложу, грязный trx наследует блокировки внешнего, значит, грязный захватит блокировки? - person Jr0; 10.11.2012
comment
Вторая транзакция будет происходить в контексте другого узла процесса, обращающегося к вашему серверу Mnesia, который работает одновременно с вашим первым процессом... - person snwight; 10.11.2012
comment
Я специально спрашиваю об этом в одном процессе, а не в двух параллельных процессах. - person Jr0; 10.11.2012
comment
Самоочевидно тогда: НЕТ. Если вы говорите о контексте одного узла, то вы либо находитесь в транзакционном блоке, либо нет, на самом деле. Если вы можете привести пример сценария, который вас беспокоит, это поможет. - person snwight; 10.11.2012