[英]should I avoid big transaction and exclude read-only queries from transaction
我看過文章說我們應該盡量限制交易的scope。
例如,而不是這樣做:
@Transactional
public void save(User user) {
queryData();
addData();
updateData();
}
我們應該使用 Spring 的TransactionTemplate
將queryData
從事務中排除(或者只是將其移出事務方法):
@Autowired
private TransactionTemplate transactionTemplate;
public void save(final User user) {
queryData();
transactionTemplate.execute((status) => {
addData();
updateData();
return Boolean.TRUE;
})
}
但我的理解是,由於JDBC 總是需要一個事務來進行所有操作,如果我使用第二種方式,將會有 2 個事務打開和關閉,
1 個用於queryData
(由 JDBC 打開),另一個用於由我們的 class 打開的transactionTemplate.execute
中的代碼。
如果是這樣,既然您已將 1 個事務拆分為 2 個,這不會浪費資源嗎?
如果事務開始,它將用完一個 DB 連接。 所以我們通常希望事務盡可能快地完成,並盡可能延遲啟動它,直到我們真正需要訪問數據庫,以便連接池有更多時間提供更多可用連接供其他請求使用。
因此,如果您的 function 中的部分工作流程需要一些時間來完成他們的工作,並且該工作不需要訪問 DB,那么最好限制事務的 scope 以排除這部分代碼。
但是在您的示例中,由於兩個事務都是串行執行的,並且都需要訪問數據庫,因此我認為沒有任何要點可以將它們分成兩個不同的事務。
此外,它是 Hibnerate 的術語,在同一個事務中加載和更新實體是非常正常的,這樣如果您更新的實體是從另一個已經關閉的事務中加載的,您就不需要處理分離的實體。 如果您不熟悉 Hibernate,則處理分離的實體並不容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.