我想首先从数据库中提取数据实体,进行一些修改并使用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();
}
}
如您所见,我执行更新程序:
现在我的问题是第一笔交易真的需要吗?(有评论的那条)
应注意,此程序可能在其他应用程序也可能对同一项目有贡献的情况下运行。也就是说,我应该确保在操作之前应该从数据库而不是从缓存中检索数据项。
答案 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
带注释的字段)。