Я использую SqlDataAdapter.Update с DataTables для обновления двух таблиц SQL в одной транзакции.Если любая из вставок не удалась, я хочу откатить все данные.Это мой код:
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
using (var scope = new TransactionScope())
{
// Insert first table
using (var command = conn.CreateCommand())
{
command.CommandText =
@"INSERT INTO TableA(Id, Data)
VALUES(@id, @data)";
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { SourceColumn = "Id" });
command.Parameters.Add(new SqlParameter("@data", SqlDbType.Char) { SourceColumn = "Data" });
var adapter = new SqlDataAdapter();
adapter.InsertCommand = command;
adapter.Update(tableADataTable);
}
// Insert second table
using (var command = conn.CreateCommand())
{
command.CommandText =
@"INSERT INTO TableB(Id, Data)
VALUES(@id, @data)";
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { SourceColumn = "Id" });
command.Parameters.Add(new SqlParameter("@data", SqlDbType.Char) { SourceColumn = "Data" });
var adapter = new SqlDataAdapter();
adapter.InsertCommand = command;
adapter.Update(tableBDataTable);
}
scope.Complete();
}
}
Проблема, с которой я столкнулся, заключается в том, что если во время выполнения второй команды возникает исключение, данные из первой команды все еще фиксируются.Нужно ли явно откатываться?Или как должен вести себя TransactionScope при использовании SqlDataAdapter.Update?
Следует отметить, что изначально у меня было создание SqlConnection в операторе TransactionScope using, но я переместил его, так как получал ошибки, которые имел мой сервер БД.неправильно настроен для распределенных транзакций.Связан ли тот факт, что мое создание SqlConnection находится вне TransactionScope?