簡體   English   中英

我應該避免大事務並從事務中排除只讀查詢嗎

[英]should I avoid big transaction and exclude read-only queries from transaction

我看過文章說我們應該盡量限制交易的scope。
例如,而不是這樣做:

@Transactional
public void save(User user) {
      queryData();
      addData();
      updateData();
}

我們應該使用 Spring 的TransactionTemplatequeryData從事務中排除(或者只是將其移出事務方法):


@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM