背景:我正在使用hibernate对象进行数据库访问 在我的servlet里面,我有:
Account account=getUserAccountHibernateObject();
doWorkOnAccount(account);
decreaseAccountBalanceAndSaveToDB(account);
由于servlet允许并发访问,所以accountBalance有时会搞砸。我有几个问题:
我应该做以下事情吗?在休眠中做什么是正确的?
Account account=getUserAccountHibernateObject();
doWorkOnAccount(account);
account=getUserAccountHibernateObject();
decreaseAccountBalanceAndSaveToDB(account); //also synchronize this method.
编辑: 暂定解决方案: 感谢答案提供的链接,我想我需要在整个servlet请求中跨越DB事务:
beginTransaction(); try{ Account account=getUserAccountHibernateObject(); doWorkOnAccount(account); decreaseAccountBalanceAndSaveToDB(account); commitTransaction(); }catch(Exception ep){ rollBackTransaction(); }finally{ closeSession(); }
如果有任何hibernate / db guru,那就有问题了,请告诉我。
答案 0 :(得分:3)
您想使用交易。有一个section of the Hibernate manual涵盖了这一点,尤其是“工作单元”部分。
答案 1 :(得分:0)
我的猜测是你的部分代码存储或访问静态变量中的数据,或者是不正确的线程安全。
我曾经研究过相对较大的Web应用程序,它们从不需要提供过多的同步(当然也不需要单线程访问)以避免并发问题。
如果没有详细说明事情的布局,很难说出具体的解决方法。