2013-07-25 92 views
0

我正在使用一些遺留的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 
+0

請添加更多詳細信息:顯示調用存儲過程的CMP/CMT的Java代碼以及創建臨時表的存儲過程。哪個數據庫? – Beryllium

+0

我已經添加了一些問題的更多信息 – djb

+0

您是否試圖將存儲過程的代碼拖入另一個方法,並使用notsupported事務類型將其從事務中排除?http://docs.oracle.com/javaee/5/tutorial/doc/bncij.html – Raji

回答

1

術語容器管理持久性意味着EJB容器處理由實體bean所需的所有數據庫訪問,範圍由一種方法實現定義。如果您需要控制事務,例如在方法執行中調用commit,您將被迫使用Bean託管持久性和UserTransaction接口方法來控制它。

不幸的是,ejb 2.x規範不允許你有一個混合的CMP/BMP實體bean,你需要選擇一個適合你的商業案例。

+0

我不介意使用BMP,如果這是一個選項...但數據源在WAS中配置爲XA,所以我默認獲得全局事務。我可能需要的是暫停交易,但不起作用。這個鏈接似乎是關於我的問題:http://lwpro2.wordpress.com/2012/02/22/sybase-sp-set-chained-off/但我已經嘗試setAutoCommit(true)和setAutoCommit(false) 。 – djb

+0

你知道一種暫時禁用XA的方法嗎?據推測,我的代碼不工作的原因是因爲@Transactional不在EJB中? – djb

+0

如果您使用的是XA驅動程序configuratino,我不認爲您可以禁用XA。您可能根本不會使用它,但我認爲您可以在交易過程中禁用它。 –

相關問題