我应该在更新前提交查询事务吗?
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();
}
}
如您所见,我的更新过程如下:
- 使用事务进行查询。
- 开始另一个事务并在新事务中进行更新。
现在我的问题是第一笔交易真的需要吗?(有评论的那个)
应该注意的是,在其他应用程序也可能对同一项目做出贡献的情况下,此程序可能 运行。即,我应该确保在对数据项进行操作之前,应该从数据库而不是缓存中检索数据项。
没有。那是完全没用的。你只需要
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
带注释的字段)。
我想先从数据库中拉出数据实体,进行一些修改,然后用休眠再次将其持久化回数据库。数据库是 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();
}
}
如您所见,我的更新过程如下:
- 使用事务进行查询。
- 开始另一个事务并在新事务中进行更新。
现在我的问题是第一笔交易真的需要吗?(有评论的那个)
应该注意的是,在其他应用程序也可能对同一项目做出贡献的情况下,此程序可能 运行。即,我应该确保在对数据项进行操作之前,应该从数据库而不是缓存中检索数据项。
没有。那是完全没用的。你只需要
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
带注释的字段)。