我正在使用SqlDataAdapter.Update與DataTables更新一個事務中的兩個SQL表。如果插入失敗,我想回滾所有數據。這是我的代碼:TransactionScope不回滾與SqlDataAdapter.Update
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();
}
}
我遇到的問題是,如果一個例外是第二個命令執行過程中引發的,從第一個命令數據仍COMMITED。我是否需要明確回滾?或者當使用SqlDataAdapter.Update時,TransactionScope應該如何表現?
需要注意的是,最初我在TransactionScope using語句中創建了SqlConnection,但是當我收到錯誤時,我的數據庫服務器沒有正確配置分佈式事務。是否我的SqlConnection創建與TransactionScope相關?