是否存在乐观锁定的替代方案

时间:2012-03-22 23:36:43

标签: java oracle java-ee nosql

我正在开发一个项目,我们收集(last_x,计数器)有关帐户的信息。 用户操作可能导致生成多个业务事件。当Web上的单个用户操作导致多个事件时,它将触发USER HISTORY表的更新。

我们执行乐观锁定以确保所有事件都导致对USER HISTORY表的更新。

问题:

乐观锁定导致额外读取(检测到冲突,再次读取和更新)和额外写入(解决冲突后)。

解决方案:

  • 每个事件都会导致插入USER HISTORY表      - 更多历史信息,导致阅读性能不佳。

还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

是否有一个重要的需要才能在此表上获得阅读效果?

听起来像是某种“工作日结束”/每小时左右,客户资料/情报表。如果是这种情况,那么您可以使用插入并考虑数据仓库技术,例如Star Schema来管理事物的(last_x,计数器)方面。

如果它更具关键性和时间依赖性,那么您的架构可能不适合这项工作。您是否考虑过使用JMS等消息传递中间件来通知和触发其他业务事件?

自从您使用Oracle后,您可以查看:Oracle AS

[编辑]根据讨论,您有计数器信息的实时生产者/消费者。我不认为数据库是解决这个问题的基本方法。您可能需要保留计数器用于会计目的,因此可能需要这样的东西:

生产者:init(从DB重建会话/ memcached)
               RECV用户操作X - > Session / Memcached(ActionX)+插入数据库。

消费者:正在运行(检查会话/ memcached是否有条件,行为)

您甚至可以使用户历史记录计数器的使用者成为生产者在计数器达到X时触发的事件的订阅者,并消除消费者对USER HISTORY的依赖

答案 1 :(得分:0)

听起来这些多个事件都遵循不同的路径,每个事件都会产生历史记录。这是对的吗?

应用程序是否应该能够控制事件并以某种方式指示其在不同路径后的相同事件?就像为每个事件生成一个唯一的ID并使该字段在DB中唯一,这样写入将失败?由于唯一约束,您可以轻松忽略失败。