Временная таблица совершения транзакции в sybase - PullRequest
0 голосов
/ 07 июля 2011

Я делаю массовую вставку, используя временную таблицу 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() для его выполнения

Выяснил, что это из-за того, что временная таблица не участвует в транзакции и не выполняет коммит. Есть ли обходной путь для этого?

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

В Sybase смешно использовать пользовательские (явные) транзакции вместе с использованием таблиц #temp (где временная таблица создается во время транзакции ).Что бы там ни было, Sybase рассматривает создание таблицы #temp (в том числе с помощью оператора select in) как оператор DDL в контексте tempdb.В редакторе с настройками по умолчанию для сервера / базы данных вы получите сообщение об ошибке, когда вы сделаете это.

В качестве теста вы можете попробовать установить параметр 'ddl in tran' (в контекстебаза данных tempdb) к истине.Затем посмотрите, не меняется ли поведение.

Обратите внимание, однако, что навсегда оставить этот параметр на месте - плохая идея (согласно документации Sybase).Я предлагаю это только для исследовательских целей.

Реальное решение (если мое предположение о проблеме верное), вероятно, заключается в том, чтобы сначала создать таблицу #temp, а затем начать транзакцию, чтобы избежать любых DDL-операций вобъем сделки.

0 голосов
/ 09 августа 2011

sp_dboption tempdb, 'ddl in tran', true

вышеупомянутая работа, даже я не могу создавать / обновлять #tables, когда proc создается с anymode.

...