对于多线程 Java 应用程序来说,确保所有线程同步访问数据库的最佳解决方案是什么?例如,每个线程代表单独的事务,并且首先检查数据库的值,然后根据答案必须插入或更新数据库中的某些字段(注意检查、插入和提交应用程序之间正在执行其他处理)。但问题是另一个线程可能在同一张表上做同样的事情。
更具体的例子。线程 T1 启动事务,然后检查表 ENTITY_TABLE 中是否有代码为“111”的条目。如果找到则更新其日期,如果未找到则插入新条目,然后提交事务。现在假设线程 T2 执行完全相同的操作。现在有几个问题:
- T1 和 T2 检查数据库并没有发现任何内容,并且都插入相同的条目。
- T1 检查数据库,找到旧日期的条目,但在提交时 T2 已经将条目更新为较新的日期。
- 如果我们使用缓存并同步对缓存的访问,我们会遇到一个问题:T1 获取锁检查数据库和缓存,如果没有找到,则添加到缓存,释放锁,提交。 T2 做同样的事情,在缓存中找到要提交的条目。但T1事务失败并被回滚。现在 T2 的状况很糟糕,因为它应该插入到 ENTITY_TABLE 但不知道这一点。
- more?
我正在致力于通过同步创建简单的自定义缓存并解决问题 3。但也许还有一些更简单的解决方案?
这应该主要在数据库中处理,通过配置所需的事务隔离 http://en.wikipedia.org/wiki/Isolation_%28database_systems%29等级。然后在此之上,您需要选择锁定策略(乐观的 http://en.wikipedia.org/wiki/Optimistic_concurrency_control或悲观)。
如果没有事务隔离,您将很难仅在 Java 域中确保事务完整性。特别是考虑到即使当前仅从 Java 应用程序访问数据库,这种情况将来也可能会发生变化。
现在至于选择哪个隔离级别,从您的描述来看,您可能需要最高的隔离级别,可序列化。然而,在实践中这往往
由于大量的锁定,成为真正的性能消耗者。因此,您可能需要重新评估您的要求,以针对您的具体情况找到隔离和性能的最佳平衡点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)