Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Механизм работы с транзакциями при работе через linkedserver с Oracle  [new]
RuCosinus
Member

Откуда:
Сообщений: 44
Добрый день.

Есть вот такая конструкция в процедуре :
	begin try
		begin tran tran_name

			<some_code_here>

			set @sql_com = 'select * from openquery([LINKED_SERVER_TO_ORACLE],''select SCHEME_NAME.GET_PARAMS('+cast(@num_id as varchar)+') from dual'')'
  			exec sp_executesql @sql_com
	 		insert into out_results 
			select XR."NUM_ID",
				XR."LINE_NUMBER",
				XR."RESULT"
			from LINKED_SERVER_TO_ORACLE..SCHEME_NAME.OUT_RESULT as XR	

			delete 
			from LINKED_SERVER_TO_ORACLE..SCHEME_NAME.OUT_RESULT

			<some_code_here>

		commit tran tran_name
	end try

	begin catch
		if @@trancount > 0
			rollback tran tran_name
			set @err = 'GW ERROR: ' + error_message()
			exec dbo.LOG_TASK @num_id = @num_id,
			@message = @err,
			@log_level = 2   -- 2 - если ошибка
		raiserror(@err,16,1)
		return -1
	end catch


Дело в том, что даже при абсолютно нормальной работе куска кода, запрятанного в транзакцию, сервер не понимает, что с внешним oracle-сервером все прошло хорошо и все благополучно откатывает. Аналогичная конструкция с try..catch, но без транзакции отрабатывает отлично. Транзакция обязательна, там за <some code> еще много всего и оно все должно откатится в случае чего.

Вопрос: как дать ему понять, что все прошло прекрасно?
27 апр 17, 16:07    [20440882]     Ответить | Цитировать Сообщить модератору
 Re: Механизм работы с транзакциями при работе через linkedserver с Oracle  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36693
RuCosinus
Дело в том, что даже при абсолютно нормальной работе куска кода, запрятанного в транзакцию, сервер не понимает, что с внешним oracle-сервером все прошло хорошо
Приведенный код откатывает транзакцию только в случае исключения, с текстом ошибки которого вы можете ознакомиться функцией error_message()
27 апр 17, 16:19    [20440917]     Ответить | Цитировать Сообщить модератору
 Re: Механизм работы с транзакциями при работе через linkedserver с Oracle  [new]
RuCosinus
Member

Откуда:
Сообщений: 44
Гавриленко Сергей Алексеевич,

да, вы правы.

The current transaction cannot be committed and cannot support operations that write to the log file. Roll back the transaction.

Похоже, что моя транзакция переходит в uncommittable state, но почему, мне не понятно. Мне это непонятно с учетом того, что:
1) Если ее вытащить из под из под транзакции, то все инструкции выполняются
2) "Транзакция переходит в нефиксируемое состояние, если внутри блока TRY происходит ошибка, которая в других обстоятельствах завершила бы эту транзакцию. Например, в результате большинства ошибок, вызываемых инструкциями языка DDL, такими как CREATE TABLE, и большинства ошибок, возникающих, когда значение параметра SET XACT_ABORT установлено в ON, транзакции вне блока TRY завершаются, а внутри блока TRY переходят в нефиксируемое состояние"
27 апр 17, 17:12    [20441169]     Ответить | Цитировать Сообщить модератору
 Re: Механизм работы с транзакциями при работе через linkedserver с Oracle  [new]
RuCosinus
Member

Откуда:
Сообщений: 44
Вот собственно и сама ошибка, похоже

The operation could not be performed because OLE DB provider "OraOLEDB.Oracle" for linked server "LINKED_SERVER_TO_ORACLE" was unable to begin a distributed transaction.

Все, теперь ясно. Нужно настроить DTC, который вроде как обещают вот тут https://msdn.microsoft.com/en-us/library/windows/desktop/aa344212(v=vs.85).aspx будет работать.

Спасибо за помощь в констатации элементарных вещей, в которых я тем не менее затупил. Без шуток.
Еще раз благодарю.
27 апр 17, 17:37    [20441245]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить