我正在处理我最后两个项目的问题。这两个项目都是用Java编写的,并使用Oracle 11g作为DB。当我查看代码时,事务管理等没有任何问题。流程非常简单,代码就像这样。
Connection con = null;
try {
//Get connection
//Run validation
//Insert record
//Commit
} catch() {
//Rollback
} finally {
//Close connection
}
验证部分会检查某些业务规则并阻止参与条目。
当用户完全调用此部分代码并提交当前事务时,只有在另一个用户到来之后才能正常工作。在这种情况下,当另一个用户想要运行此代码时,因为提交的另一个事务更改验证部分可以查看记录并防止重复。
但是当两个用户同时运行相同的代码时,有时会发生重复记录。流程如下,我不知道如何处理它。我已经看过隔离级别等,但它们都不适用于这种情况。唯一适用的是使用唯一约束,但它不适合项目。
另一个案例是奇怪的,我无法在我的测试中重现它,但我在生产中目睹了它。当系统负载很高时,系统会在用户单击时创建重复记录。这意味着用户只按下按钮一次,但系统会在后台创建多个记录。这些记录具有不同的ID,但几乎完全创建时间,所有其他值都相同。
我们最初认为,当系统负载很高时,应用程序服务器无法正确处理它(因为它是一个旧的未安装的)并且因为它很少发生,我们将它留在那里。但是过了一段时间之后我们又出于另一个原因将应用程序服务器更改为另一个服务器,问题仍然存在。我提到的第二个项目有一个完全不同的应用服务器。
我和两个不同的团队在几周内就这些问题进行了研究,但我们找不到适合这两个案例的解决方案,我们甚至找不到第二个问题的原因。如果你们遇到这样的事情或者知道解决方案,那么欢迎任何帮助。
答案 0 :(得分:0)
您需要对对象使用同步以避免重复。可能RUN VALIDATION块可能是修复此问题的理想选择,但它实际上取决于您的应用程序逻辑。
与您的Web服务器无关,您需要使用Idempotent HTTP方法提交表单。