--老賀的BLOG
解決問題的思路: HibernateTemplate 中的 Connection 必定一致。那么就從 HibernateTemplate 入手。
看 spring 的源代碼,既然是 Hibernate ,那么,就沒有 Connection 給你看,只有 Session ,由 Session 來管理 Connection ,那么用事務來控制的話,這個 Session 必定在所有該事務中是一致的。于是在 HibernateTemplate 中找到:
看來在 SessionFactoryUtils 里面,接著在 SessionFactoryUtils.getSession 中找:
這個方法太長了,太復雜了,從簡,發現了非常關鍵的一點:
假如 sessionHolder 不等于空,說明,在事務中有這樣一個還沒有 commit 的 session ,那么就返回這個 session ,假如等于空,新建一個 session ,并且在事務里加入這個 session 。這段代碼的意思大概是這樣,太繁雜了,只能猜,也肯定是如此。
再看 getHibernateTemplate() 方法來自繼承 HibernateDaoSupport ,看了電子書《 spring-reference 》的第九章“ Dao 支持”, Dao 的支持類可以有好多,如: JdbcDaoSupport , HibernateDaoSupport , JdoDaoSupport 等等。
既然前面一開始就是從 jdbc 的 spring 事務控制引起的,那么看到了同樣的 HibernateDaoSupport---JdbcDaoSupport ,那么 JdbcDaoSupport 也應該有 getJdbcTemplate() 這個方法,并且返回 JdbcTemplate 這個類。
果然如此。
于是剖析 JdbcTemplate 是不是和 HibernateTemplate 一樣。果然一樣。
注意到:
Connection 是從 DataSourceUtils.getConnection() 來的,繼續跟蹤 DataSourceUtils.getConnection() 。
找到:
ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
和 Hibernate 中的一模一樣,因為沒有了 session 的封裝,條理在 jdbc 中更加清晰了。
至此, spring 的事務控制 已經全部搞定。
Powered by: BlogJava Copyright © 老賀