Мой код что-то вроде этого
try
{
using (TransactionScope iScope = new TransactionScope())
{
try
{
isInsertSuccess = InsertProfile(account);
}
catch (Exception ex)
{
throw;
}
if (isInsertSuccess)
{
iScope.Complete();
retValue = true;
}
}
}
catch (TransactionAbortedException tax)
{
throw;
}
catch (Exception ex)
{
throw;
}
Теперь случается, что даже если мое значение TRUE, исключение TransactionAbortedException происходит случайным образом, но данные вставляются/обновляются в БД.
Любая идея, что пошло не так?
Как сообщает TransactionAbortedException
,
Это исключение также бросается, когда делается попытка совершить транзакцию и прерывания транзакции.
Вот почему вы видите исключение даже после вызова Transaction.Complete
: метод Complete
- это не то же самое, что Commit
вызов этого метода [
TransactionScope.Complete
] не гарантирует совершение транзакции. это просто способ информирования менеджер транзакций вашего статуса
Транзакция не выполняется до тех пор, пока вы не выйдете из инструкции using: подробности см. в документации CommittableTransaction.Commit
. В этот момент любые действия, участвующие в транзакции, могут проголосовать за отмену транзакции, и вы получите TransactionAbortedException
.
Чтобы отладить основную проблему, вам необходимо проанализировать детали исключения и трассировку стека. Как отметил Марк в комментарии, это может быть вызвано тупиком или другим взаимодействием с другими процессами базы данных.
rethrow
и ничего с ними не делаете? Кроме того, почему у вас есть два идентичных блокаcatch
для разных типов исключений?