首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2EE JTA 與資料庫事務實測:Sybase + WebLogic 多 Connection 與 SP 交互規律

     編輯:Java 相關知識

環境:Sybase ASE + WebLogic 8.1 + Tx Data Source。測試容器管理事務(CMT,Required)下,Stored Procedure(SP)與多 Connection 交互的具體行為。

關鍵前提

  • SP 創建前需 SET CHAINED ON(開啟隱式事務模式)。
  • EJB 方法 trans-attribute=Required,容器啟動/傳播 JTA 事務。
  • JDBC Connection setAutoCommit(false) 或預設;設 true 會拋出「Cannot set auto commit to true when in distributed transaction」。

三種場景測試結果

場景Connection 策略setAutoCommit結果
方法一多方法共用同一 Connectionfalse/預設✅ 成功,同一 JTA 事務內多 SP 參與
方法二各方法各自獲取 Connectionfalse/預設✅ 成功,WebLogic 同一 JTA 事務下多 Connection 自動登記 XA
方法二(錯誤)各方法各自 Connection某方法設 false❌ 拋出「SET CHAINED command not allowed within multi-statement transaction」
方法三各方法各自 Connection + 方法級 Requiredfalse/預設❌ 同理報錯,嵌套 Required 導致事務邊界混亂

核心結論

  1. 分佈式事務下絕對不能調用 setAutoCommit(true),容器接管事務邊界。
  2. 同一 JTA 事務中多個 Connection 需支援 XA,WebLogic Tx Data Source 已自動處理。
  3. SP 內若用 CHAINED 模式,外層不可再有顯式事務邊界(如嵌套 Required 或手動 setAutoCommit(false)),否則衝突。
  4. 最佳實踐:統一用 CMT Required,共用或多 Connection 均可,保持 Connection 預設 autoCommit=false,SP 只管業務邏輯,事務交給容器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved