繁体   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