2013-12-18 5 views
2

У нас есть код, я, поддерживая, где у меня есть что-то вроде этого:транзакции следующие Откат

<cftransaction> 
    <cftry> 
     ... do some stuff here which may throw an exception ... 
     <cftransaction action="commit"> 
     <cfcatch> 
      <cftransaction action="rollback"> 
      <cfif someCondition> 
       <cfset someFunctionThatAffectsTheDB() /> 
       <cftransaction action="commit" /> 
      </cfif> 
     <cfcatch> 
    <cftry> 
</cftransaction> 

Я немного хитрый фиксации в улове, что происходит после отката. Я искал interwebs для информации о том, что может произойти в таком случае, но пока ничего не нашел, что бы сказать, что произойдет, если вы попытаетесь совершить сделку после отката внутри одного и того же блока транзакций. Кто-нибудь знает, что это будет делать и хорошо ли это делать или плохо?

(Причина, по которой я прошу, состоит в том, что у нас есть состояние данных в нашем db, которое, как я думаю, не должно быть возможным, и мне интересно, не является ли поведение commit-after-rollback неопределенным и тонким и может вызвать Я вижу.)

+1

Специфические значения зависят от db. Какие dbms и версия вы используете? (Всегда полезно включать эту информацию с любыми вопросами db). Я считаю, что с SQL Server открытие 'cftransaction' (без каких-либо действий) запускает [' SET IMPLICIT_TRANSACTION ON'] (http://technet.microsoft.com/en-us/library/aa259220%28v=SQL.80%29 .aspx), которая определяет поведение последующих действий 'COMMIT' и' ROLLBACK' в этом контексте. Но снова вам нужно проверить документацию своей базы данных на предмет специфики. – Leigh

+0

Я верю, что происходит, когда откаты откатываются назад, а затем фиксация в catch будет совершать любые операции db, которые произошли после откат. На самом деле это довольно просто, я думаю, подумав об этом немного. – jinglesthula

+0

Да, это то, что предлагает документация SQL Server. Вы всегда можете проверить это с помощью SQL Profiler и/или включить отладку в вашем DSN и проверить файлы журнала. – Leigh

ответ

0

Вышел на конечность и спросил нашего администратора. Он указал, что откат откатывает все, что было сделано в db, и что любые дальнейшие изменения в этой точке (например, изменения, сделанные вызовом someFunction ...) будут зафиксированы при последующей фиксации. Я не делал проверенного теста, и он может варьироваться в зависимости от настроек и поставщика БД, но я думаю, что так оно и работает.

0

Я принимаю ваш someFunctionThatAffectsTheDB() как вы регистрируете ошибку? Если вы используете Oracle, я рекомендую, чтобы ни одна из ваших хранимых процедур не содержала коммитов. Конец произойдет, когда будет достигнут закрывающий тег cftransaction. Но для ошибок регистрации и т. Д. Вы должны объявить, что хранимый proc как PRAGMA AUTONOMOUS_TRANSACTION; и в нем будет иметься фиксация. Тогда вам не нужно беспокоиться об использовании каких-либо действий = «откат или фиксация». У нас есть огромное приложение и очень редко когда-либо нужно было использовать cftransaction для совершения или отката, потому что нам нужно все, чтобы работать, или все, чтобы вернуться к тому, как это было. И наша регистрация ошибок - это единственный процесс, который должен быть PRAGMA AUTONOMOUS_TRANSACTION; Если вы не используете Oracle, тогда просто игнорируете, извините, вы не указали свой сервер.

+0

с использованием MS SQL Server – jinglesthula

Смежные вопросы