我希望有人能为我澄清下面的场景。
据我了解,例如,当您从 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/