Erlang 更好地理解如何工作/平衡记忆能力';s事务/ACID功能

Erlang 更好地理解如何工作/平衡记忆能力';s事务/ACID功能,erlang,mnesia,Erlang,Mnesia,我仍在努力深入理解人们可以用记忆来做什么,回答这两个问题将大有帮助 1) 如果一个进程执行关于记录X的原子事务,而另一个进程执行涉及该记录的脏事务,会发生什么情况。第一道工序的酸性是否受损 2) 同一进程是否有办法在一个表的行上持有非脏(mnesia:transaction/1)读锁,同时在另一个表上执行脏操作?在允许脏操作的数据库环境中,隔离保证会丢失,就像mnesia一样。因此,问题1)的答案是肯定的,行为良好的事务流程可能会受到并发脏操作的危害,反之亦然——例如,脏读可能会返回“旧”甚至新

我仍在努力深入理解人们可以用记忆来做什么,回答这两个问题将大有帮助

1) 如果一个进程执行关于记录X的原子事务,而另一个进程执行涉及该记录的脏事务,会发生什么情况。第一道工序的酸性是否受损


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

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

在第二个场景中,答案是肯定的,原因有两个:只有您正在使用的数据对象 reading已锁定,此时只有您的本地副本!这通常是一件很好且有用的事情,甚至允许在其他数据对象(当然包括其他表)上进行并发事务


关于#2,如何?我希望同样的过程在一张桌子上有一个trx,而在另一张桌子上做一个脏trx。事务是通过传递给mnesia:transaction/1的函数实现的,那么我如何同时拥有脏trx呢?如果我嵌套它们,脏trx会继承外部的锁,所以脏trx会获取锁?第二个事务将在另一个进程节点的上下文中发生,该进程节点寻址您的Mnesia服务器-与您的第一个进程同时运行…我特别要求在同一进程中执行此操作,显然不是两个并行进程本身:不是。如果你说的是单节点上下文,那么你要么在事务块内,要么不在事务块内,好吧。如果你能提供一个你担心的场景的例子,那会有所帮助。