更好地理解如何工作/平衡 mnesia 的事务/ACID 功能

Jr0*_*Jr0 6 erlang mnesia

我仍在尝试深入了解 Mnesia 可以做什么,这两个问题的答案将会有很大帮助。

1) 如果一个进程对记录 X 执行原子事务,而其他进程执行涉及同一记录的脏事务,会发生什么情况。第一个进程的 ACID 属性是否受到损害?

2)有没有办法让同一个进程在一个表的行上持有非脏(mnesia:transaction / 1)读锁,同时对另一个表进行脏操作?

snw*_*ght 1

在允许脏操作的数据库环境中,隔离保证会丢失,就像 Mnesia 一样。因此,问题 1)的答案是肯定的,行为良好的事务处理过程可能会受到并发脏操作的影响,反之亦然 - 例如,脏读可能会返回“旧”甚至新删除的数据,而固有的危险脏写是显而易见的。

在第二种情况下,答案是肯定的,原因有两个:只有您正在读取的数据对象被锁定,并且只有您的本地副本被锁定!这通常是一件很好且有用的事情,甚至允许在其他数据对象(当然包括其他表)上发生并发事务。

Erlang Mnesia 文档,第 4 章