【问题标题】:Better understanding how to work/balance mnesia's transactional/ACID capabilities更好地理解如何工作/平衡 mnesia 的事务/ACID 功能
【发布时间】:2012-10-29 05:12:03
【问题描述】:

我仍在努力深入了解使用 Mnesia 可以做什么,这两个问题的答案将大有帮助。

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

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

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

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

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

    Erlang Mnesia docs, Chapter 4

    【讨论】:

    • 关于#2,怎么样?我希望相同的过程在一张桌子上有一个 trx,而在一秒钟上做一个脏 trx。事务是通过传递给 mnesia:transaction/1 的函数实现的,那么我如何同时拥有脏 trx?如果我嵌套它们,dirty trx继承了outer的锁,那么dirty会抢锁吗?
    • 第二个事务将发生在另一个处理您的 Mnesia 服务器的进程节点的上下文中 - 与您的第一个进程同时运行...
    • 我特意问的是在同一个进程中执行此操作,而不是两个并行进程
    • 不言而喻:NO。如果您谈论的是单个节点上下文,那么您要么在事务块内,要么不在,afaik。如果你能提供一个你担心的场景的例子,那会有所帮助。
    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多