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

Should I commit the transaction for a query before update?

我想先从数据库中拉出数据实体,进行一些修改,然后用休眠再次将其持久化回数据库。数据库是 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. 开始另一个事务并在新事务中进行更新。

现在我的问题是第一笔交易真的需要吗?(有评论的那个)

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

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

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 带注释的字段)。