我正在考虑使用Oracle数据库来同步来自不同服务器上的两个或多个Web应用程序的并发操作。数据库是这些应用程序的共同单一基础结构元素。
两个或更多应用程序很可能会在同一时刻(cron调用)尝试执行相同的操作。我想使用数据库让一个应用程序决定它将是那个将完成工作的应用程序,而其他应用程序根本不会这样做。
一般的想法是对所有连接执行某种原子和可见的选择/插入节点的ID。只有与select返回的第一个插入节点ID具有相同id的节点才能完成工作。
有人向我建议合并声明可以在这里使用。但是,在做了一些研究后,我发现了一个讨论,其中指出了the merge statement is not designed to be called
另一种选择是锁定表格。根据定义,只有一个节点能够锁定服务器并执行插入,然后选择。锁定被删除后,其他实例将看到插入的值,并且不会执行工作。
您会考虑哪些其他解决方案?我对随机延迟的变通方法皱眉,甚至使用oracle异常来通知节点它不应该做的工作。我更喜欢干净的解决方案。
答案 0 :(得分:0)
我最终选择了SELECT FOR UPDATE
。它按预期工作。重要的是要记住在进行所需的更新后立即提交事务,以便其他节点不会挂起等待该值。