Вот текущая архитектура исходного кода области моей транзакции. Третья вставка вызывает исключение .NET (не исключение SQL) и не откатывает два предыдущих оператора вставки. Что я делаю не так?
РЕДАКТИРОВАТЬ: Я удалил попытку/catch из вставки2 и вставки3. Я также удалил утилиту обработки исключений из вставки1 try/catch и поставил «throw ex». Он по-прежнему не откатывает транзакцию.
РЕДАКТИРОВАТЬ 2: Я добавил try/catch обратно в метод Insert3 и просто добавил "throw " в операторе catch. Он по-прежнему не откатывает транзакцию.
ОБНОВЛЕНИЕ: Судя по полученным отзывам, класс «SqlHelper» использует объект SqlConnection для устанавливает соединение с базой данных, затем создает объект SqlCommand, устанавливает для свойства CommandType значение «StoredProcedure» и вызывает метод ExecuteNonQuery объекта SqlCommand.
Я тоже не стал добавлять Привязка транзакции = Явная отмена привязки к текущей строке подключения. Я добавлю это во время моего следующего теста.
public void InsertStuff()
{
try
{
using(TransactionScope ts = new TransactionScope())
{
//perform insert 1
using(SqlHelper sh = new SqlHelper())
{
SqlParameter[] sp = { /* create parameters for first insert */ };
sh.Insert("MyInsert1", sp);
}
//perform insert 2
this.Insert2();
//perform insert 3 - breaks here!!!!!
this.Insert3();
ts.Complete();
}
}
catch(Exception ex)
{
throw ex;
}
}
public void Insert2()
{
//perform insert 2
using(SqlHelper sh = new SqlHelper())
{
SqlParameter[] sp = { /* create parameters for second insert */ };
sh.Insert("MyInsert2", sp);
}
}
public void Insert3()
{
//perform insert 3
using(SqlHelper sh = new SqlHelper())
{
SqlParameter[] sp = { /*create parameters for third insert */ };
sh.Insert("MyInsert3", sp);
}
}
Подробнее здесь: https://stackoverflow.com/questions/339 ... ransaction