Вот текущая архитектура исходного кода транзакции. Третья вставка генерирует исключение .NET(не исключение SQL) и не откатывает два предыдущих оператора вставки. Что я делаю неправильно?
EDIT: Я удалил try/catch из insert2 и insert3. Я также удалил утилиту обработки исключений из try/catch insert1 и поставил "throw ex". Он по-прежнему не откатывает транзакцию.
EDIT 2: Я добавил попытку/уловить метод Insert3 и просто поставлю "throw" в выводе. Он по-прежнему не откатывает транзакцию.
ОБНОВЛЕНИЕ: Основываясь на полученной обратной связи, класс "SqlHelper" использует объект SqlConnection для установления соединения с базой данных, затем создает объект SqlCommand, задает свойство CommandType "StoredProcedure" "и вызывает метод ExecuteNonQuery для SqlCommand.
Я также не добавил Transaction Binding = Explicit Unbind в текущую строку подключения. Я добавлю, что во время моего следующего теста.
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);
}
}