我应该在更新前为查询提交事务吗?

时间:2015-09-07 04:00:49

标签: hibernate transactions

我想首先从数据库中提取数据实体,进行一些修改并使用hibernate再次将其保存回数据库。数据库是Mysql。

我可以使用以下代码段执行此操作:

public boolean updateStockQuantity(long quantityId, long quantity){
    Session session = HBSession.getSession();
    Transaction tx = session.beginTransacton();
    StockEntity stock = session.get(StockEntity.class, quantityId);
    tx.commit();   // <- Is this commit() really needed to prevent 
                   // a dirt update while other apps may also try to update this entity?
    stock.setQuantity(quantity);
    Transaction tx1 = session.beginTransaction();
    session.save(stock);
    try{
       tx1.commit();
       return true;
    }catch(Exception e){
       e.printExceptionStack();
       tx1.rollback();
       return false;
    }finnaly{
       session.close();
    }
}

如您所见,我执行更新程序:

  1. 使用交易执行查询。
  2. 开始另一笔交易并在新交易中进行更新。
  3. 现在我的问题是第一笔交易真的需要吗?(有评论的那条)

    应注意,此程序可能在其他应用程序也可能对同一项目有贡献的情况下运行。也就是说,我应该确保在操作之前应该从数据库而不是从缓存中检索数据项。

1 个答案:

答案 0 :(得分:1)

没有。那完全没用。你所需要的只是

Session session = HBSession.getSession();
Transaction tx = session.beginTransacton();
try {
    StockEntity stock = session.get(StockEntity.class, quantityId);
    stock.setQuantity(quantity);
    tx.commit();
    return true;
}
catch(Exception e) {
   tx.rollback();
   return false;
} finally {
   session.close();
}

您的代码(不是我的代码)都不会阻止两个集合读取,然后同时更新同一个实体。要更新的最后一个事务将保持其更改。如果要防止这种情况,请使用乐观锁定(即@Version带注释的字段)。