【发布时间】:2012-09-18 18:44:35
【问题描述】:
我们的 Java EE Web 应用程序使用 iBatis (ORM) 执行数据库操作。数据库操作流程如下
流程 : JSP --->Action--->ServiceIMpl--->DaoImpl---->通过'IBatis 调用更新查询
注意:Action、Service 和 DAO 类是使用 Spring 2.5 的依赖注入技术实例化的。我们使用 Struts2。
问题:2 个并发用户搜索相同的记录,User1 更新 Attribute1,而 User2 更新 Attribute2。用户 1 首先单击“保存”,然后用户 2 单击保存(它们彼此跟随,相差几秒钟)。当我们看到数据库中的数据时,只有 User1 的更新存在。 Audit 列也只显示 User1 的更新。 User2对Attribute2的更新没有完成,同时没有抛出异常。
我们尝试在 iBatis 中使用开始事务和提交事务,围绕在 sqlmap xml 中定义的更新查询的调用。同样的问题仍然存在。我们也尝试删除这些事务命令,但问题仍然存在。
我们是否应该在更新期间做一些特殊/不同的事情来处理并发?像 iBatis 这样的 ORM 不会自己处理吗?
其他信息:进一步调查发现了以下信息。
当用户 1 和用户 2 点击记录时,将获取完整的数据以供查看。
现在,当 User1 和 User2 都更改了一些属性并单击保存(同时)时,假设首先更新 User1 的数据,然后在更新 User2 的数据时,User1 已经更新的数据被覆盖并丢失。
What approach is usually followed in such screens to handle such scenarios ?
【问题讨论】:
-
这不是一个真正的 struts2 问题。不知道 iBatis 但奇怪的是没有抛出异常,如果可能的话增加日志记录级别。找出正在使用的锁定方案,考虑乐观锁定。
-
@Quaternion 我已经更新了这个问题,还有一些更新......
标签: spring concurrency struts2 ibatis