首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring+Hibernate 事務異常:No Hibernate Session bound to thread 排查

     編輯:程式設計綜合問答

錯誤現象

org.hibernate.HibernateException: No Hibernate Session bound to thread,
and configuration does not allow creation of non-transactional one here

根因

DAO 方法在無事務上下文下調用 getCurrentSession(),Spring 未為當前線程綁定 Session。

常見誤區

  1. Service 類未加 @Transactional。
  2. Service 內部方法互調(this.xxx())繞過代理,事務失效。
  3. @Transactional 放在 private/protected 方法上(代理不攔截)。
  4. 異常被捕獲且未標記回滾,導致事務提交但 Session 已關閉。

排查步驟

  1. 檢查 Service 類/方法是否有 @Transactional。
  2. 臨時在報錯 Service 方法加 @Transactional(propagation = Propagation.REQUIRES_NEW) 測試。
  3. 啟用 Spring 事務日誌:logging.level.org.springframework.transaction=DEBUG。
  4. 編寫測試方法 testService() 無業務邏輯,僅調用 DAO,驗證事務配置本身是否生效。

正確配置

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</prop>
        </props>
    </property>
</bean>

最佳實踐

  • 事務邊界在 Service 層,DAO 無事務註解。
  • 使用 @Transactional(readOnly = true) 標記查詢方法,優化性能。
  • 避免在事務方法中調用外部 RPC/耗時操作,防止長事務鎖死資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved