我正在使用一些遺留的JDBC代碼,並將其配置爲使用容器管理的持久性,到目前爲止它對我管理的事務工作正常,除了在存儲過程失敗調用。容器管理的持久性和存儲過程創建臨時表
一些存儲過程創建臨時表,這些臨時表需要在事務中間進行提交。所以我得到一個異常抱怨,如果我使用容器管理持久性,我不能調用提交。
有沒有人知道解決這個問題的方法?
更多信息:
如果我添加在commit()到我的查詢結束後,我得到:
DSRA9350E:操作Connection.commit全局事務中是不允許的。
所以我推測Sybase JDBC 4 XA驅動程序正在爲我管理事務。如果我在代碼中拋出異常,它會回滾。
public Connection getConnection() throws SQLException {
if (connection == null) {
this.connection = dataSource.getConnection();
this.connection.setAutoCommit(!useTransaction);
this.connection.setTransactionIsolation(transactionIsolationLevel);
}
logger.info("Connection [ "+ connection.toString() +" ]");
return connection;
}
從哪裏獲得的連接通常具有自動提交爲「假」,而對於存儲的特效,它已經自動提交的「真正」的一部分。但無論如何,存儲臨時表與臨時表得到:
java.sql.SQLException:SELECT INTO命令不允許在多語句事務。
這有點令人困惑。數據源由容器設置,我只需使用resource-ref標籤從上下文中獲取它們。它們是XA數據源,因此它們提供全局事務。我嘗試用Spring來禁用它:通過在方法
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public ResultSet executeProcedure(String sql, String[] parameterTypes,
String[] parameterValues) throws SEEException {
SqlParameters parameters = this.convertParameters(parameterTypes, parameterValues);
return super.executeProdedure(sql, parameters);
}
但我仍然得到錯誤的類和@Transactional提供 @Component
<context:component-scan base-package="package.path.to.class.with.method" />
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" />
。
存儲過程看起來有點像這樣(procxmode是UNCHAINED)。存儲的proc defn本身就是一個事務,所以我認爲我必須沒有活動事務進入。但是我不能編輯存儲的proc本身。它已經生產了多年:在EJB 2.x的
define sp_example
begin
create table #temp {}
begin
insert into #temp {}
end
begin
select from #temp {}
end
end
請添加更多詳細信息:顯示調用存儲過程的CMP/CMT的Java代碼以及創建臨時表的存儲過程。哪個數據庫? – Beryllium
我已經添加了一些問題的更多信息 – djb
您是否試圖將存儲過程的代碼拖入另一個方法,並使用notsupported事務類型將其從事務中排除?http://docs.oracle.com/javaee/5/tutorial/doc/bncij.html – Raji