很抱歉复制,但我想我没有得到满意的答案,所以再次发布 假设我有跟随签名的方法
Object getData(int id) {
//create a entity manager
//get data frm db
//return data
}
updateData() {
Object obj = getData(id)
//get entity manager
//start transcation tx
//update
//commit tx
}
现在会引起并发问题吗?在最坏的情况下,数据是否会过时?例如。
如果我getData
,并且在我更新时,如果有人更新数据,我的updateData
会有陈旧数据吗?
现在我可以使用以下内容:我能解决问题吗?
Object getData(int id,Entitymanager em) {
//get data frm db using em
//return data
}
updateData() {
Object obj = getData(id)
//get entity manager em
//start transcation tx
//getdata using getData(id,em)
//commit tx
}
答案 0 :(得分:0)
如果两个单独的请求同时访问updateData()
,您可能会收到陈旧数据。您可以通过锁定updateData()
中提取的数据来处理陈旧性。如果您使用Hibernate作为JPA提供程序,则可以按如下方式锁定数据:
updateData() {
Object obj = getData(id);
Session session = (Session) em.getDelegate();
session.refresh(obj, LockMode.UPGRADE);
}
刷新是必要的,因为在updateData
中另一个事务完成的提取和锁定数据之间可能会发生。
请注意,getData
和updateData
中使用的实体经理必须相同。