2011-07-07 19 views
0

我正在使用sybase臨時表方法(#表名稱)進行批量插入。這發生在一個事務中。但是,此操作正在提交數據事務。 (我自己並沒有做一個connection.commit)。我不希望這種承諾發生,因爲我可能不得不稍後回滾整個事務。任何想法,爲什麼插入使用臨時表是提交事務不問被問?我如何解決這個問題?在sybase中提交事務的臨時表

的sql是一樣的東西

select * into #MY_TABLE_BUFFER from MY_TABLE where 0=1; 
load table #MY_TABLE_BUFFER from 'C:\temp\123.tmp' WITH CHECKPOINT ON; 
insert into MY_TABLE on existing update select * from #MY_TABLE_BUFFER; 
drop table #MY_TABLE_BUFFER; 

,我使用statement.executeUpdate()執行它

想通了,不參與其交易,由於臨時表,做一個承諾。 有沒有解決這個問題的方法?

+1

請向我們展示一些代碼並正確格式化。您是否將[自動提交](http://download.oracle.com/javase/1.3/docs/api/java/sql/Connection.html#setAutoCommit%28boolean%29)設置爲false? – Jacob

+0

你說你使用'statement.executeUpdate()'。你是否從其他代碼中調用它?從Java的例子? – Nivas

+0

@cularis。是。其設置爲假。 @尼瓦斯是的。來自java代碼 – gautham

回答

3

Sybase對於使用用戶指定的(也就是顯式的)事務並結合使用#temp表(在創建臨時表而處於事務中時)很有趣。無論好壞,Sybase都認爲在tempdb的上下文中創建#temp表(包括通過'select into'語句)是DDL語句。在編輯器中,使用默認的服務器/數據庫設置,當你這樣做時你會得到一個錯誤。

作爲測試,您可以嘗試將'ddl in tran'設置(在tempdb數據庫的上下文中)設置爲true。然後,看看行爲是否改變。

但是,請注意,將該設置永久保留在原位是一個壞主意(根據Sybase文檔)。我只是爲了調查目的而提出這個建議。

真正的解決方案(如果我對問題的假設是正確的)可能在於首先創建#temp表,然後開始事務,以避免事務範圍內的任何DDL stmts。

0

的sp_dboption tempdb中, 'DDL在TRAN',真

上述shuld工作,甚至我也不能當PROC與anymode創建創建/更新#tables。