2012-02-13 62 views
5

我發現下面的螺紋:How exactly JdbcTemplate with TransactionManager works together?Spring事務管理器是否將連接綁定到線程?

的該第一句:

據我理解的DataSourceTransactionManager結合從指定的數據源,以當前線程的JDBC連接,從而允許一個線程綁定每個數據源的連接。如果它是一個連接池,它將採用其中一個可用連接。

......正是我想知道的。

當使用事務管理器時,你最終會得到每個線程擁有自己的單一連接嗎?此外,該連接還有多久?同一個線程在單個請求中是否使用相同的連接,還是有其他事情發生?我只是想了解當你有一個事務管理器的時候Spring究竟在做什麼,當你不知道(不管你是否真的有事務)。

回答

10

當使用事務管理器時,最終每個線程都擁有自己的單個連接嗎?此外,該連接還有多久?

該連接通常從連接池獲得。當事務管理器啓動事務時,連接從池中借用,然後在事務完成時返回到池。在此期間,連接被綁定到線程。

做同樣的線程中使用整個一個請求

它使用的交易時間相同的連接相同的連接。請求本身是不相關的。不管你是否真的有交易

總是有交易,不管你做明確與否。如果您沒有明確配置,那麼JDBC驅動程序和數據庫將在執行單個操作時啓動並完成一個。 Spring的事務管理(或任何其他框架的事務管理)允許您跨多個操作延長該事務的生命週期。這樣做需要在交易期間獨佔使用連接。

+0

謝謝你的迴應。它有助於我更好地理解正在發生的事情。我瞭解事務管理如何允許事務擴展到多個操作。但是,就我而言,我在每個DAO方法上都有@Transactional(propagation = Propagation.SUPPORTS),這意味着每個調用都將使用它自己的獨立事務。在管理器從池中獲得初始連接之後,它會將該連接綁定到當前線程,然後從那裏爲線程的生命檢索它,而不是返回到池以獲取連接? – dnc253 2012-02-14 16:27:38

+0

「每次電話會使用它自己的獨立交易」 - 這是不正確的。您的DAO將「繼承」已經綁定到線程的任何現有事務。除非沒有綁定,否則它不會啓動一個新的。 – skaffman 2012-02-14 16:33:09

+1

我想我定義「交易」的方式並不完全正確。我理解一個事務的方式是當你有一個單獨的數據庫操作(可以有任何數量的更新,插入等)。這一切發生或沒有發生。 DAO的設置方式,每個方法都會獨立於其他方法在DB上運行。如果一個方法失敗,它不會影響其他方法在失敗之前或之後執行的操作。那麼,到底什麼是「交易」呢?我認爲每種方法都會創建它自己的新交易,但顯然情況並非如此? – dnc253 2012-02-14 20:10:35