JPA和JTA中的并发问题
可能的重复:
JPA 中的并发(过时数据)问题
抱歉重复,但我想我没有得到满意的答案所以再次发帖 假设我有具有以下签名的方法
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
}
Possible Duplicate:
concurrency (stale data) problem in JPA
Sorry for duplicating, but I think I didn't get satisfactory answers so posting again
Let's say I have methods with following signature
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
}
Now will it cause concurrency issue? Can data be stale in worst case? E.g.
if I getData
and by the time I update, if someone updates the data will my updateData
will have stale data?
Now can i use following:Will i solve the problem?
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
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果两个单独的请求同时访问 updateData(),您可能会得到过时的数据。您可以通过在
updateData()
中锁定获取的数据来处理过时情况。如果您使用 Hibernate 作为 JPA 提供程序,则可以按如下方式锁定数据:刷新是必要的,因为在获取数据和锁定数据之间可能会发生另一个事务在
updateData
中完成的情况。请记住,
getData
和updateData
中使用的实体管理器必须相同。If two separate requests access
updateData()
concurrently you may get stale data. You may handle the staleness by locking the fetched data inupdateData()
. If you're using Hibernate as your JPA provider you can lock the data as follows:The refresh is necessary because it may happen that between the fetching and the locking of the data another transaction completes in
updateData
.Please keep in mind that the entity manager used in
getData
andupdateData
must be the same.