Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как транзакции становятся uncommitable?  [new]
dobriy-kot
Member

Откуда:
Сообщений: 5
Привет.

Рылся в BOL, гугле, но нигде не нашел четкого объяснения, что конкретно превращает транзакцию в uncommitable? Вообще, четкого определения тоже нет.
Вот цитата с MSDN:
автор
If an error generated in a TRY block causes the state of the current transaction to be invalidated, the transaction is classified as an uncommittable transaction. An error that ordinarily ends a transaction outside a TRY block causes a transaction to enter an uncommittable state when the error occurs inside a TRY block. An uncommittable transaction can only perform read operations or a ROLLBACK TRANSACTION. The transaction cannot execute any Transact-SQL statements that would generate a write operation or a COMMIT TRANSACTION. The XACT_STATE function returns a value of -1 if a transaction has been classified as an uncommittable transaction. When a batch finishes, the Database Engine rolls back any active uncommittable transactions. If no error message was sent when the transaction entered an uncommittable state, when the batch finishes, an error message will be sent to the client application. This indicates that an uncommittable transaction was detected and rolled back.

И еще одна:
автор
Inside a TRY…CATCH construct, transactions can enter a state in which the transaction remains open but cannot be committed. The transaction cannot perform any action that would generate a write to the transaction log, such as modifying data or trying to roll back to a savepoint. However, in this state, the locks acquired by the transaction are maintained, and the connection is also kept open. The effects of the transaction are not reversed until a ROLLBACK statement is issued, or until the batch ends and the transaction is automatically rolled back by the Database Engine. If no error message was sent when the transaction entered an uncommittable state, when the batch finishes, an error message will be sent to the client application that indicates an uncommittable transaction was detected and rolled back.

A transaction enters an uncommittable state inside a TRY block when an error occurs that would otherwise have ended the transaction. For example, most errors from a data definition language (DDL) statement (such as CREATE TABLE), or most errors that occur when SET XACT_ABORT is set to ON, terminate the transaction outside a TRY block but make a transaction uncommittable inside a TRY block.

The code in a CATCH block should test for the state of a transaction by using the XACT_STATE function. XACT_STATE returns a -1 if the session has an uncommittable transaction. The CATCH block must not perform any actions that would generate writes to the log if XACT_STATE returns a -1. The following code example generates an error from a DDL statement and uses XACT_STATE to test the state of a transaction in order to take the most appropriate action.

Но из этого непонятно, какими могут быть причины. Например, такой код делает uncommitable транзакцию:
BEGIN TRANSACTION

BEGIN TRY
	DECLARE @cond INT
	SET @cond = 'A'
END TRY

BEGIN CATCH
	PRINT 'a'
END CATCH
А такой нет:
BEGIN TRANSACTION

BEGIN TRY
	INSERT INTO #tt(i) SELECT NULL
END TRY

BEGIN CATCH
	PRINT 'a'
END CATCH
И такой тоже нет:
BEGIN TRANSACTION

BEGIN TRY
	DECLARE @cond INT
	
	RAISERROR('aaa', 11, 1);
END TRY

BEGIN CATCH
	PRINT 'a'
END CATCH

Объясните, пожалуйста, а то никак не пойму.
19 окт 11, 19:40    [11469006]     Ответить | Цитировать Сообщить модератору
 Re: Как транзакции становятся uncommitable?  [new]
aleks2
Guest
An error that ordinarily ends a transaction outside a TRY block causes a transaction to enter an uncommittable state when the error occurs inside a TRY block.
Те перевести?
19 окт 11, 19:54    [11469062]     Ответить | Цитировать Сообщить модератору
 Re: Как транзакции становятся uncommitable?  [new]
dobriy-kot
Member

Откуда:
Сообщений: 5
aleks2, ну давай, переведи. :) Я наверно что-то не так понимаю, раз ты так уверен.
19 окт 11, 19:58    [11469078]     Ответить | Цитировать Сообщить модератору
 Re: Как транзакции становятся uncommitable?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
dobriy-kot
aleks2, ну давай, переведи. :) Я наверно что-то не так понимаю, раз ты так уверен.
Что не понятно-то из фразы? Дать ссылку на онлайновый переводчик?
19 окт 11, 21:40    [11469383]     Ответить | Цитировать Сообщить модератору
 Re: Как транзакции становятся uncommitable?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31956
Гавриленко Сергей Алексеевич
Дать ссылку на онлайновый переводчик?
онлайновый переводчик
Ошибки, которые обычно концы сделки вне блока TRY причины сделки ввести нефиксируемое состояние при возникновении ошибки внутри блока TRY.

Не очень понятно :-)

Лучьше просто русский BOL открыть:
BOL
Транзакция переходит в нефиксируемое состояние, если внутри блока TRY происходит ошибка, которая в других обстоятельствах завершила бы эту транзакцию. Например, в результате большинства ошибок, вызываемых инструкциями языка DDL, такими как CREATE TABLE, и большинства ошибок, возникающих, когда значение параметра SET XACT_ABORT установлено в ON, транзакции вне блока TRY завершаются, а внутри блока TRY переходят в нефиксируемое состояние.
19 окт 11, 22:15    [11469507]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить