java - hibernate 如何处理冲突?

标签 java hibernate

我希望有人能为我澄清下面的场景。

据我了解,例如,当您从 hibernate 中请求“行”时:

User user = UserDao.get(1);

我知道内存中有 id=1 的用户。

在一个网络应用中,如果两个网页同时请求和加载用户,然后都更新用户对象的一个​​属性,会发生什么?例如:

user.pageViews += 1; // the value is current 10 before the increment
UserDao.update(user);

这会使用内存中的值(两个请求的值都是 10),还是会使用数据库中的值?

最佳答案

您必须为两个用户使用两个 hibernate session 。这意味着内存中有两个对象实例。如果您只使用一个 hibernate session (因此内存中对象的一个​​实例),那么结果是不可预测的。

在并发更新的情况下,第二次更新获胜。第一次更新的值被第二次更新覆盖。为了避免第一次更新丢失,您通常使用版本列(请参阅 hibernate 文档),然后第二次更新会收到一个错误,您可以捕获该错误并对其使用react(例如,错误消息“您的记录已在同时。请重新加载。”这允许第二个用户在修改后的记录上重做他的修改,以确保他的修改不会丢失。

在页面浏览计数器的情况下,就像在您的示例中一样,作为一种不同的解决方案,您可以编写一个同步方法来按顺序计算页面浏览量。

关于java - hibernate 如何处理冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586016/

相关文章:

XML 格式未知时的 Java XPath 命名空间

java - "Compilation failed; see the compiler error output for details."错误

java - c3p0 getConnection 在连接数增加时挂起

java - 生成类型标识给出错误,即 id(primary key) 没有默认值

java - Microsoft ODBC Excel 驱动程序

java - 在 IntelliJ IDEA 下使用 Lombok 时无法编译项目

java - 仅替换完全匹配

java - 当 Tomcat 无法启动我的 Spring/Hibernate Web 应用程序时,如何找到错误?

java - Spring Data JPA - 连接表上的可分页排序

java - 如何使用 Tomcat 8 或 9 在部署时自动启动 Hibernate