Новый триал [сборка 13258].

Привет всем.

На сайт выложен дистрибутив нового триала, в который внесены следующие изменения:

1. [BUG FIX] Устранена утечка памяти при взаимодействии с Distributed Transaction Coordinator (DTC). В случае ошибок commit/rollback/prepare IBProvider создавал и регистрировал в системе COM-объекты с описанием проблемы. Оказалось что поток DTC, который взаимодействует с транзакцией IBProvider-а, не освобождает эти error-объекты и в результате происходит утечка памяти.

2. [BUG FIX] Исправлено взаимодействие с DTC через интерфейс ITransactionEnlistmentAsync. Теперь провайдер приводит передаваемый код завершения операции к одному из допустимых значений. Обнаружилось, что если передавать, к примеру, в PrepareRequestDone код завершения XACT_E_COMMITFAILED, то происходит зависание в работе программы.

3. Оптимизация реализации интерфейсного метода ITransactionResourceAsync::PrepareRequest. Теперь провайдер учитывает параметр fSinglePhase и если он равен TRUE, то сразу выполняет коммит транзакции (о чем потом сообщает DTC через ITransactionEnlistmentAsync::PrepareRequestDone). Таким образом, в случае когда в распределенной транзакции участвует только одна транзакций, IBProvider выполняет сразу commit вместо двухфазного завершения транзакции через prepare+commit.

4. [BUG FIX] При попытке явного завершения транзакции, подключенной к DTC, через интерфейсный метод ITransaction::Commit, провайдер вернет код ошибки XACT_E_COMMITPREVENTED. Ранее возвращался код E_FAIL, который подразумевал, что провайдер осуществил откат транзакции.

5. [BUG FIX] При ошибке prepare/commit транзакции, которая подключена к DTC, не осуществлялся откат транзакции. Точнее провайдер пытался выполнить этот откат, но (из-за ошибки в логике) генерировал ошибку «откат транзакции, подключенной к DTC, запрещен».

6. Улучшены сообщения об ошибках commit/prepare. Теперь, если провайдер после ошибки commit/prepare будет осуществлять откат транзакции, он сообщит об этом.

7. [BUG FIX] В случае ошибки коммита вложенной транзакции (фактически это освобождение точки сохранения через запрос «RELEASE SAVEPOINT»), провайдер не осуществлял откат этой транзакции («ROLLBACK TO SAVEPOINT»).

8. Расширен список имен известных HRESULT кодов. Так что теперь, в текстах ошибок провайдера (например, при взаимодействии с DTC), будет меньше HEX-представлений кодов ошибок.


Ревизия и доработка механизма управления транзакциями пока не завершена, поэтому в августе релиза, включающего в себя все выше перечисленные исправления, не будет.

В планах:
1. Запрет неявного коммита вложенных транзакций при коммите охватывающих транзакций. То есть, все транзакции нужно будет явно коммитить. Будет добавлено новое свойство «nested_trans_rules», которое позволит настраивать данное поведение. Это уже реализовано и частично оттестировано.

2. Нужно переработать управление первым уровнем транзакции. Текущая реализация стала немного «расхлябанной» и позволяет делать нежелательные вещи. К примеру — получать объект корневой транзакции (первый уровень) для неактивной транзакции.


PS. Если вы смогли прочитать это сообщение и ни разу не зевнули, то мой вам респект и уважуха 🙂

Leave a Comment