【问题标题】:How does db4o support concurrency and transactions?db4o 如何支持并发和事务?
【发布时间】:2011-03-24 18:37:21
【问题描述】:

我们正在为一个在服务器端使用 Java 的大容量电子商务网站寻找 db40。并发和事务支持对我们来说非常重要。当客户购买商品时,我们需要锁定产品和客户对象,以在单个事务中分别更新库存和客户订单历史记录。这对 db4o 可行吗?我想确保它支持多对象事务。

【问题讨论】:

    标签: concurrency transactions db4o


    【解决方案1】:

    这里已经有类似的问题了,比如one。而我的回答也差不多。

    关于大容量电子商务网站:db4o 从未构建为大容量、大数据库,而是用于桌面和移动应用程序等嵌入式用例。好吧,这取决于“高音量”是什么意思。我认为这意味着数百或并发事务。这肯定超出了 db4o 的范围。

    并发和事务支持:db4o 内核本质上仍然是单线程的,因此只能提供少量并发操作。 db4o supports transactionsread committed isolation。这意味着一个事务只能看到其他事务的已提交状态。在实践中,这是一个非常薄弱的​​保证。

    以您的示例为例:您可以在一次交易中使用产品和消费者更新购买。然而,另一个事务可以更新这些对象中的任何一个并提交。然后,已经读取了一些对象的正在运行的事务可能会使用旧值进行计算并存储它。所以弱隔离会“污染”你的状态。 您可以使用锁来防止这种情况发生,但是 db4o 没有任何好的对象锁定机制。而且会进一步降低性能。

    总而言之,我认为您可能需要一个“更大”的数据库,它对并发和事务处理有更好的支持。

    【讨论】:

    • 核心是单线程的?这也适用于 db4o 的老大哥 Versant VOD 吗?我觉得很难相信。如果它在核心是单线程的,那意味着简单的读取必须排队等待其他读取执行。 10 倍于 RDBMS 的性能究竟来自哪里?
    • 当然VOD 不是这样。我陈述了 db4o 的当前状态。 VOD 是另一种野兽,支持所有这些功能
    • 在数据库理论方面相当薄弱,我有兴趣阅读更多关于更好的隔离方案而不是“读取提交隔离”的信息。你能指出一些关于“更大”数据库如何更好地处理这个问题的信息吗?我进行了搜索,但找不到太多。也许你至少可以提供一些关键词。
    • @user646584 额外的性能不是来自它的并发能力,而是来自复杂对象持久化的速度。见:polepos.org
    【解决方案2】:

    听起来你需要使用 db4o semaphores

    【讨论】:

    • 当然可以。但是要获得细粒度的锁定权是困难的并且需要大量的工作。它使缩放方面变得更糟。在这一点上,我认为你应该选择一个“更大”的数据库,它可以更好地支持这些事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多