相关疑难解决方法(0)

hibernate中的并发性

我有一个servlet为用户做一些工作,然后减少用户的信用.当我实时查看数据库中用户的信用时,如果来自同一用户的并发请求很多,则由于并发控制而导致信用额被错误地扣除.T假设我有一个服务器,并且使用的数据库管理是休眠.我正在使用事务控制来跨越整个请求,请参阅代码以获取详细信息.我有几个问题:

  1. 为什么当面对来自同一用户的许多并发请求时,db中的信用计数器会跳到各处?为什么我的交易控制不起作用?

  2. 如果我在检索用户帐户后修改了基础数据,然后尝试更新它,为什么我没有得到任何数据HibernateException(eg.StaleObjectException)呢?

  3. 我有整个用户请求的事务跨度,有更好的方法吗?请批评.如果您觉得我做错了,请随意重写示例代码结构.

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;
} …

database concurrency hibernate

3
推荐指数
1
解决办法
2万
查看次数

标签 统计

concurrency ×1

database ×1

hibernate ×1