| 維度 | JDBC 事務 | JTA 事務 |
|---|---|---|
| 適用場景 | 單數據源、本地資源管理 | 多分據源、跨資源管理器(XA) |
| 實現原理 | 調用 Connection.commit/rollback | 委託 JTA TransactionManager 協調兩階段提交 |
| 配置複雜度 | 低,默認模式 | 高,需應用服務器支持(如 JBoss、WebLogic) |
| 性能開銷 | 輕量 | 較重(協調器、日誌、鎖) |
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<property name="hibernate.current_session_context_class">thread</property>

<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
org.hibernate.transaction.JBossTransactionManagerLookup // 視容器而定
</property>
<property name="hibernate.current_session_context_class">jta</property>

Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
// 業務操作
tx.commit();
} catch (Exception e) {
if (tx != null) tx.rollback();
throw e;
} finally {
session.close();
}
無論底層是 JDBC 還是 JTA,上層 API 保持一致,實現了事務策略的透明切換。
@Transactional,由 HibernateTransactionManager (JDBC) 或 JtaTransactionManager (JTA) 代理。