2011-07-07 4 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から? @cularis。 – Nivas

+0

はい。その値はfalseに設定されます。 @ Nivasはい。 Javaコードから – gautham

答えて

3

Sybaseは#tempテーブル(の取引中にが作成されたテンポテーブル)を使用して、ユーザ指定の(別名明示的な)トランザクションを併用するのは面白いです。より良いか悪いかに関わらず、Sybaseはtempdbのコンテキストで#tempテーブルの作成(「select into」ステートメントを含む)をDDL文にすることを検討しています。エディターで、デフォルトのサーバー/ db設定で、これを行うとエラーが発生します。

テストとして、 'ddl in tran'設定(tempdbデータベースのコンテキスト内)をtrueに設定してみてください。次に、動作が変化するかどうかを確認します。

ただし、その設定を永続的にそのまま残すことは、悪い考えです(Sybaseのマニュアルごと)。私は調査目的のためだけにそれを提案しています。

実際の解決策(問題の私の前提が正しい場合)は、#tempテーブルを最初に作成してからトランザクションを開始し、トランザクションのスコープ内のDDL stmtsを避けることにあります。

0

のsp_dboption tempdbを、 'DDLでTRAN'、真の

上記shuld作業、さえもprocがanymodeで使用して作成する場合/更新#TABLESを作成することはできませんよ。

関連する問題