【问题标题】:Temporary table committing the transaction in sybasesybase中提交事务的临时表
【发布时间】:2011-07-07 12:12:34
【问题描述】:

我正在使用 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() 来执行它

发现这是由于临时表未参与事务并执行提交。 有什么解决方法吗?

【问题讨论】:

  • 请向我们展示一些代码并正确格式化。您是否将 auto commit 设置为 false?
  • 你说你使用statement.executeUpdate()。你是从其他代码中调用它吗?例如来自 Java?
  • @cularis。是的。其设置为假。 @尼瓦斯是的。来自java代码

标签: java sql sybase


【解决方案1】:

Sybase 将用户指定(又名显式)事务与#temp 表(临时表在在事务中创建)结合使用很有趣。无论好坏,Sybase 都将创建#temp 表(包括通过'select into' 语句)视为tempdb 上下文中的DDL 语句。在带有默认服务器/数据库设置的编辑器中,执行此操作时会出现错误。

作为测试,您可以尝试将“ddl in tran”设置(在 tempdb 数据库的上下文中)设置为 true。然后,看看行为是否改变。

但是请注意,永久保留该设置是一个坏主意(根据 Sybase 文档)。我只是出于调查目的而提议它。

真正的解决方案(如果我对问题的假设是正确的)可能在于首先创建#temp 表,然后开始事务,以避免事务范围内的任何 DDL stmts。

【讨论】:

    【解决方案2】:

    sp_dboption tempdb, 'ddl in tran',true

    以上应该可以工作,即使在使用任何模式创建 proc 时,我也无法创建 /update #tables。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2019-01-22
      • 1970-01-01
      • 2011-08-21
      • 2011-05-03
      相关资源
      最近更新 更多