2013-12-22 1 views
1

Возможно, это действительно пустой вопрос, так как я довольно новичок в обработке транзакций с PetaPoco. Проблема, с которой я сталкиваюсь с использованием PetaPoco в качестве микрокорпорации для обработки транзакции db, заключается в том, что если я сделаю исключение непосредственно перед методом транзакции .Complete(), все будет отброшено правильно, но если я поймаю исключения внутриОперация PetaPoco не откатывается назад

Using scope As PetaPoco.Transaction = db.GetTransaction() 
    ' try/catch here and if the db command fails transaction won't roll back 

    scope.Complete() 
End Using 

транзакция не откатится, если одна из операций db завершилась с ошибкой. Как я могу это решить?

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Я не знаком с транзакцией PetaPoco. Однако, быстро глядя на код PetaPoco, управление транзакциями кажется забавным и, откровенно говоря, бесполезным в среде Microsoft. Почему бы вам просто не окружить транзакционный код стандартным оператором использования TransactionScope (например: http://msdn.microsoft.com/library/ee818746.aspx), он должен отлично работать с большинством стандартных баз данных. –

+0

Спасибо, Саймон, я думаю, что то, что использует petapoco под капотом, - это инфакт объекта, даже с петапоко, вы не можете откатить транзакцию «вручную», но она работает так: «Если вы хотите отменить транзакцию, вы не должны вызывать метод« Полный »в пределах область транзакции. Например, вы можете выбросить исключение в пределах области действия. Сделка, в которой он участвует, будет отброшена ». Но по какой-то причине я попытался не вызывать .Compete(), но первый db-запрос претерпел то же самое. Кстати, я расскажу о методе .NET .NET и отчитаюсь здесь. – Manight

ответ

2

Проблема заключалась в том, что я неправильно обрабатывал «вызов/не вызов» scope.Complete() на основе Исключений, перехваченных по пути. В частности, у меня был булев флаг «rollBackTransaction», начинающийся с false, а затем обновление до true, если какой-либо из блока try/catch внутри транзакции поднят и исключение. В конце концов, я просто проверил:

    If Not rollBackTransaction Then 
         scope.Complete() 
        End If 

Это может также использоваться для TransactionScope предложил Саймон которым в конечном итоге откат транзакции, если .Complete() не вызывается перед закрытием с помощью блока.

Теперь, что вызывало ложный флаг и, таким образом, вызывало метод scope.Complete() каждый раз, заключалось в том, что внутри транзакции я назвал sub, у которого была собственная обработка исключений, и поэтому никогда не будет приводить к исключению в основной транзакции чтобы правильно обновить флаг «rollBackTransaction».

Что я узнал, так это то, что если вы используете try/catch внутри транзакции, будьте уверены, что внешние методы, которые вы вызываете, вызывают исключение, если они падают, и обновляют флаг все время, основываясь на том, .Complete().

В любом случае Саймон, спасибо за указание на то, что .NET-функция я не знал, что кажется чрезвычайно полезным! Интересно, что еще он будет включать в транзакцию ... изменения файловой системы?