簡體   English   中英

sybase中提交事務的臨時表

[英]Temporary table committing the transaction in sybase

我正在使用 sybase 臨時表方法(#表名)進行批量插入。 這發生在事務中。 但是,此操作正在提交數據事務。 (我沒有做一個connection.commit自己)。 我不希望這種提交發生,因為我以后可能不得不回滾整個事務。 知道為什么使用臨時表插入是在不被詢問的情況下提交事務嗎? 我該如何解決這個問題?

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()來執行它

發現這是由於臨時表沒有參與事務並進行提交。 有什么解決方法嗎?

Sybase 將用戶指定(又名顯式)事務與 #temp 表(臨時表在事務中創建)結合使用很有趣。 無論好壞,Sybase 都將創建#temp 表(包括通過'select into' 語句)視為tempdb 上下文中的DDL 語句。 在帶有默認服務器/數據庫設置的編輯器中,執行此操作時會出現錯誤。

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

但是請注意,永久保留該設置是一個壞主意(根據 Sybase 文檔)。 我提議它僅用於調查目的。

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

sp_dboption tempdb, 'ddl in tran',true

以上應該可以工作,即使在使用任何模式創建 proc 時也無法創建 /update #tables。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM