【发布时间】:2011-06-20 02:30:52
【问题描述】:
对于多线程 Java 应用程序来说,确保所有线程同步访问数据库的最佳解决方案是什么?例如,每个线程代表单独的事务,首先检查 db 的值,然后根据答案插入或更新数据库中的某些字段(注意在检查、插入和提交之间的应用程序正在执行其他处理)。但问题是另一个线程可能在同一张桌子上做同样的事情。
更具体的例子。线程 T1 启动事务,然后检查表 ENTITY_TABLE 是否有代码为“111”的条目。如果找到更新它的日期,如果没有找到插入新条目,然后提交事务。现在想象线程 T2 做同样的事情。现在有几个问题:
- T1 和 T2 检查 db 并没有发现任何内容,并且都插入了相同的条目。
- T1 检查 db,找到具有旧日期的条目,但在提交时,T2 已经将条目更新为更近的日期。
- 如果我们使用缓存并同步访问缓存,我们会遇到问题:T1 获取锁检查数据库,如果没有找到缓存,则添加到缓存,释放锁,提交。 T2 做同样的事情,在缓存中找到要提交的条目。但是 T1 事务失败并被回滚。现在 T2 状态不佳,因为它应该插入到 ENTITY_TABLE 但不知道。
- 更多?
我正在创建具有同步功能的简单自定义缓存并解决问题 3。但也许有一些更简单的解决方案?
【问题讨论】:
标签: java database multithreading synchronization