Откат транзакции .net Oracle Data Provider не работает - PullRequest
1 голос
/ 03 февраля 2010

Так вот в чем проблема.

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

Теперь я понял, что если в функции, вставляющей в таблицу 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 Ответ

1 голос
/ 03 февраля 2010

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

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

Это означает, что каждая из моих функций, которые имели свои собственные команды подключения и транзакции, должна была быть изменена, чтобы сначала принять аргументы 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);
}
...