我看過文章說我們應該嘗試限制事務的范圍,例如,而不是這樣做:
@Transactional
public void save(User user) {
queryData();
addData();
updateData();
}
我們應該queryData使用 Spring將其從事務中排除TransactionTemplate(或者只是將其移出事務方法):
@Autowired
private TransactionTemplate transactionTemplate;
public void save(final User user) {
queryData();
transactionTemplate.execute((status) => {
addData();
updateData();
return Boolean.TRUE;
})
}
但我的理解是,由于JDBC總是需要一個事務來進行所有操作,如果我使用第二種方式,就會有2個事務打開和關閉,1個用于queryData(由JDBC打開),另一個用于transactionTemplate.execute我們類打開的代碼。如果是這樣,既然您已將 1 個事務拆分為 2 個,這不會浪費資源嗎?
uj5u.com熱心網友回復:
如果事務開始,它將用完一個 DB 連接。所以我們通常希望事務盡快完成,并盡可能延遲啟動它,直到我們真正需要訪問資料庫,以便連接池有更多時間提供更多可用連接供其他請求使用。
因此,如果您的函式中的部分作業流需要花費一些時間來完成他們的作業,而訪問 DB 不需要該作業,那么最好限制事務的范圍以排除這部分代碼。
但是在您的示例中,由于兩個事務都是按順序執行的,并且都需要訪問 DB ,因此我認為沒有任何要點可以將它們分成兩個不同的事務。
此外,就 Hibernate 而言,在同一個事務中加載和更新物體是非常正常的,這樣如果您更新的物體是從另一個已經關閉的事務中加載的,您就不需要處理分離的物體。如果您不熟悉 Hibernate,則處理分離的物體并不容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/406483.html
標籤:
