我有一个servlet为用户做一些工作,然后减少用户的信用.当我实时查看数据库中用户的信用时,如果来自同一用户的并发请求很多,则由于并发控制而导致信用额被错误地扣除.T假设我有一个服务器,并且使用的数据库管理是休眠.我正在使用事务控制来跨越整个请求,请参阅代码以获取详细信息.我有几个问题:
为什么当面对来自同一用户的许多并发请求时,db中的信用计数器会跳到各处?为什么我的交易控制不起作用?
如果我在检索用户帐户后修改了基础数据,然后尝试更新它,为什么我没有得到任何数据HibernateException(eg.StaleObjectException)呢?
我有整个用户请求的事务跨度,有更好的方法吗?请批评.如果您觉得我做错了,请随意重写示例代码结构.
Main servlet class:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try{
Manager.beginTransaction();
cmdDowork(request, response);
Manager.commitTransaction();
}catch(Exception exp){
Manager.rollbackTransaction();
exp.printStackTrace();
}
finally{
Manager.closeSession();
}
}
public void cmdDowork(){
try{
UserAccount userAccount = lazyGetUserAccount(request.getParameter("userName"));
doWorkForUser(userAccount);//time and resource consuming process
if(userAccount!=null) {
decUserAccountQuota(userAccount);
}
}catch (HibernateException e){
e.printStackTrace();
}
}
public static UserAccount lazyGetUserAccount(String userName) {
UserAccount userAccount = Manager.getUserAccount(userName);
if(userAccount == null){
userAccount = new UserAccount(userName);
userAccount.setReserve(DEFAULT_USER_QUOTA);
userAccount.setBalance(DEFAULT_USER_QUOTA);
Manager.saveUserAccount(userAccount);
}
return userAccount;
} …