我有一个设计问题。考虑在多个集群环境中运行的应用程序,可以说有3个集群。应用程序侦听目录,并处理所有导出的新文件并将其发送到文档管理系统。我只想要一个集群处理给定的文件,这样我就可以避免竞争条件。为此,我创建了一个名为DocumentLock的锁表,以便我可以使用数据库作为仲裁者。这3列是guid(主键),文件ID(这是来自文件的唯一名称),锁定时间戳。我正在使用Spring事务,并将Oracle作为数据库。我打算使用Read_Committed隔离级别。春季交易和插入数据库
因此,假设集群A获取文件A,同时集群B也获得文件A的保存。现在,使用事务A的集群A将尝试插入到DocumentLock表中,并且可以说它是成功的。所以我将在DocumentLock表中有1行,唯一的ID是文件A(文件名)。现在,同时使用Tx-B的集群B尝试向DocumentLock表中插入一条记录,但由于我使用'Read_Committed'隔离级别,因此需要等到Tx-A提交。因此TX-B将等待州。一旦Tx-A被提交,现在Tx-B将尝试插入相同的记录(文件A),并且因为它违反了唯一性约束,它将引发错误。
我对Read_committed的理解是否正确?
我试图避免多个集群在表中插入相同的文件(唯一记录),所以我假设如果两个事务开始同时插入相同的文件名,其中一个需要等到另一个一个是承诺?那么Oracle如何决定哪个事务(Tx-A或Tx-B)获得表(锁)?还有Read_committed,整个表是锁定的,还是只是行?
另外,如果不同的文件集B中获取的举行,说文件B应该插入没有任何问题的DocumentLock,为群集A是处理文件A和集群B需要处理的文件B. 感谢您的帮助
感谢您的回答。对于案例1,如果由于某种原因事务A被回滚,并且集群B认为集群A处理了文件F1。这不是脏读的经典案例吗? –
如果你正在做一些处理这些文件的事情。您的群集逻辑应该再次遍历文件列表以确定是否有任何文件需要处理。在上面提到的Dirty Read的情况下,集群B在再次尝试循环文件时应该得到文件F.应该有一些连续的轮询方法来查找未处理的文件。这种方式会在下次轮询中处理脏读。 –
这是有道理的。谢谢 –