2010-02-02 3 views
1

Так что это проблема..net Откат транзакций Oracle Data Provider не работает

Мне нужно вставить в tableA и получить его новый идентификатор строки. После этого я должен вставить этот id в tableB. Я должен зафиксировать после вставки в tableA, чтобы при попытке вставить в tableB я не получу исключение внешнего ключа.

Теперь я понял, что если в функции, которая вставляет в таблицуB, возникает исключение, когда блок try-catch ловит исключение, то исходная вставка в таблицу будет отклонена. Это не так.

Я делаю ошибку где-то, но я не знаю, где. Есть ли способ выполнить то, что мне нужно здесь?

try 
    { 

     tableAinsert.ExecuteNonQuery(); 
     transaction.Commit(); 

     id= Int32.Parse(tableAinsert.Parameters["id"].Value.ToString()); 

     if (vsType == "I") 
     { 
      tableBinsert(vsType, eventId, id); 
     } 

    } 
    catch (Exception err) 
    { 
     transaction.Rollback(); 
     throw (err); 
    } 

ответ

1

Там, мой коллега указал на проблему.

Кажется, что необходимо использовать одно и то же соединение и одну и ту же транзакцию, чтобы иметь возможность откатить многоступенчатую вставку, подобную этой. И это может быть только одно действие за транзакцию.

Это означает, что каждая из моих функций, у которых были свои собственные команды соединения и транзакции, должна была быть изменена, чтобы сначала принять аргументы OracleConnection и OracleTransaction и вычеркнуть код commit() и другие связанные строки.

Так изменение кода я написал, это будет выглядеть следующим образом

OracleConnection conn = new OracleConnection(); 
// .... create your command, set the connection string, etc, etc 
var transaction = conn.BeginTransaction(); 
cmd.Transaction = transaction; 

try 
{ 

    tableAinsert.ExecuteNonQuery(); 


    id= Int32.Parse(tableAinsert.Parameters["id"].Value.ToString()); 

    if (vsType == "I") 
    { 
     tableBinsert(vsType, eventId, id, conn, transaction); 
    } 

    transaction.Commit(); //Moved this commit to the end of the block 

} 
catch (Exception err) 
{ 
    transaction.Rollback(); 
    throw (err); 
} 
Смежные вопросы