Начало » Использование СУБД » Firebird, HQbird, InterBase » isc_prepare_transaction() , isc_prepare_transaction2() (ту бы, или не ту бы) 
	
		
		
			| isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3151] | 
			Thu, 21 September 2023 13:11   | 
		 
		
			
				
				
				
					
						  
						МП
						 Сообщений: 889 Зарегистрирован: August 2022  Географическое положение: бурятский тун...
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		Здравствуйте ВСЕ! 
 
В очередной раз перетрахивая код и отделяя мух от котлет, решил разнести ординарные транзакции и 2PC-транзакции по разным классам. В процессе возник вопрос. 
В Бормадовском IBX транзакции всегда стартуются как multiple и коммитятся сразу по isc_commit_transaction() невзирая на то, сколько баз задействовано. 
В принципе работает, да и хер с ним. isc_commit_transaction() сам все две фазы провернёт. 
Но это в том случае, если не лезть в гетерогенные среды.  
А вот если у меня на одном конце приложения один сервер, а на другом - совсем другой (а то и вообще не Firebird), то isc_prepare_transaction() таки нужен. 
 
Я правильно понимаю? 
 
зы: про EXTERNAL DATA SOURCE пока не будем.
		
		
		
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |  
	
		
		
			| Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3157 является ответом на сообщение #3154] | 
			Thu, 21 September 2023 22:44    | 
		 
		
			
				
				
				
					
						  
						hvlad
						 Сообщений: 381 Зарегистрирован: August 2022 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		МПhvladДаже если серверы разные, но все участники распределённой тр-ции - Firebird, то isc_prepare_transaction() по-прежнему не обязательна. 
круто! 
т.е. клиент по DB-хендлам просекает что сервера разные и колдует соответственно? Ему это не нужно.  
Если логика приложения подразумевает, что все участники - серверы Firebird (Interbase), то, обычно, никаких  
дополнительных телодвижений не нужно - достаточно isc_start_multiple() и isc_commit_transaction(). Никакого 
специального "колдовства" нет, тем более ничего не зависит от того, что там за реальные серверы. 
 
МПhvladPS И ещё там была isc_reconnect_transaction() 
о-па! 
в хидере её вижу, а в API Guide описалова нет (и на Дебаркадере в доке к IB-2020 нет). 
у меня она задекларирована так: 
Tisc_reconnect_transaction = function(status_vector: PISC_STATUS;
  db_handle: PISC_DB_HANDLE;
  tran_handle: PISC_TR_HANDLE;
  isc_arg4: Short;
  isc_arg5: PChar): ISC_STATUS;
stdcall;  
что и как она делает? 
 
зы: подозреваю что isc_arg4 и isc_arg5 для записи в RDB$TRANSACTION_DESCRIPTION ? Она позволяет получить клиентский хендл одного участника подготовленной  
распределённой тр-ции, чтобы потом перевести его в финальное состояние вызовом commit или rollback.  
Есс-но, после анализа состояний остальных участников. 
Последняя пара пар-ров указывают на буфер с ID этого участника и размер буфера. 
Т.е. тот, кто вызывает isc_reconnect_transaction() должен хорошо понимать, что он делает. 
На практике этим занимается gfix. 
		
		
		
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |  
	| 
		
 |  
	
		
		
			| Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3165 является ответом на сообщение #3164] | 
			Fri, 22 September 2023 14:14    | 
		 
		
			
				
				
				
					
						  
						hvlad
						 Сообщений: 381 Зарегистрирован: August 2022 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		МПя правильно понимаю, что если использовался prepare, а не prepare2, то в RDB$TRANSACTIONS никакого ID не будет. Не правильно. 
 
Если ты создавал тр-цию, как распределённую (с несколькими участниками), то prepare для такой тр-ции создаст  
стандартное описание и передаст его каждому участнику (через их prepare). 
 
Если тебе не нужно стандартное описание (т.е. ты сам координируешь участников), то ты либо создаёшь своё, 
и сам решаешь где и как его хранить, либо передаёшь его в prepare2. 
 
МПтогда где его взять? Там, в куда ты его сохранил   
		
		
		
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	
		
		
			| Re: isc_prepare_transaction() , isc_prepare_transaction2() [сообщение #3167 является ответом на сообщение #3166] | 
			Fri, 22 September 2023 15:09   | 
		 
		
			
				
				
				
					
						  
						hvlad
						 Сообщений: 381 Зарегистрирован: August 2022 
						
					 | 
					Senior Member  | 
					 | 
		 
		 
	 | 
 
	
		МПhvladМПя правильно понимаю, что если использовался prepare, а не prepare2, то в RDB$TRANSACTIONS никакого ID не будет. Не правильно. 
 
Если ты создавал тр-цию, как распределённую (с несколькими участниками), то prepare для такой тр-ции создаст стандартное описание и передаст его каждому участнику (через их prepare). непонимэ. 
isc_prepare_transaction() мне нихрена кроме ISC_STATUS не вернёт. А кто и где говорил, что он тебе вернёт что-то ещё ? 
 
Если ты сам себе координатор, то сам узнавай нужную тебе для восстановления инф-цию ДО того как вызовешь  
prepare и сам же храни её где и как хочешь. 
 
Если же ты пользуешься координатором из fbclient, то тебе не нужно вызывать isc_reconnect_transaction, это 
сделает gfix, когда ты его попросишь. 
 
Как я уже говорил, стандартный координатор создаёт описание распределённой тр-ции и передаёт его каждому  
участнику. Каждый участник сохраняет его в своей БД в rdb$transactions. gfix потом читает это описание, 
извлекает из него нужные данные, соединяется с каждой тр-цией каждого участника (где возможно) и пытается 
завершить распределённой тр-цию. 
 
Код gfix открыт для изучения, ты же не хочешь чтобы я ещё и его тут так подробно комментировал ? 
 
МПгде я возьму ID для isc_reconnect_transaction()? См. выше. 
 
Ты вообще с какой целью это всё спрашиваешь ?  
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 10:16:22 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00916 секунд 
 |