我正在使用 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()
来执行它
发现这是由于临时表不参与事务并进行提交所致。 有什么解决办法吗?
最佳答案
Sybase 的有趣之处在于,将用户指定的(也称为显式)事务与 #temp 表(临时表是在事务中创建的)结合使用。无论好坏,Sybase 都将 #temp 表的创建(包括通过“select into”语句)视为 tempdb 上下文中的 DDL 语句。在编辑器中,使用默认服务器/数据库设置,执行此操作时会收到错误消息。
作为测试,您可以尝试将“ddl in tran”设置(在 tempdb 数据库的上下文中)设置为 true。然后,查看行为是否发生变化。
但是请注意,永久保留该设置不是一个好主意(根据 Sybase 文档)。我建议它仅用于调查目的。
真正的解决方案(如果我对问题的假设是正确的)可能在于首先创建#temp表,然后开始事务,以避免事务范围内的任何DDL stmts。
关于java - sybase中临时表提交事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6610379/