gpt4 book ai didi

java - 如何避免Stateless Session Bean中的并发?

转载 作者:行者123 更新时间:2023-12-01 19:03:23 25 4
gpt4 key购买 nike

我有一个 SLSB,它可以增加实体中的数字。如果两个线程同时到达 SLSB,我会在两个请求中得到相同的数字。

SLSB提取物

@Stateless(mappedName = "ejb/CustomerManager")
public class CustomerManagerBean implements CustomerManager {
...
public String recoverName(int id) {
Customer customer = (Customer) em.createQuery("from Customer where id = :id").setParameter("id", id).getSingleResult();
int oldValue = customer.getValue();
int newValue = oldValue + 1;
customer.setValue(newValue);
[BP] return customer.getName() + " value=" + customer.getValue();
}
...
}

实体提取

@Entity
public class Customer implements Serializable {
@Id
private int id;
private int value;
}

为了测试该问题,我在 SLSB 恢复名称方法中标有 [BP] 的行处设置了一个断点。然后从两个独立的浏览器页面进行两次调用。在断点处,两次调用的值相同

当第二个调用尝试使用 setter 修改值时,是否应该抛出某种异常?

我使用 JBoss 5 作为 AS,使用 MySql 或 Oracle 作为数据库(都尝试过)

感谢您的帮助

最佳答案

如果您向实体添加 @Version 注释字段,您将在刷新时遇到异常,JPA 将使用该字段进行乐观锁定。

每次 JPA 更新实体时,它都会将内存中的版本与数据库中的版本进行比较,如果不匹配就会抛出异常。如果它们匹配,版本将增加。

只需将以下内容添加到您的实体:

@Column(name = "version")
@Version
private long version;

(当然,并将相应的列添加到数据库中)

关于java - 如何避免Stateless Session Bean中的并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11311345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com