我使用 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();
}
}
我遇到的问题是,如果在第二个命令执行期间引发异常,则仍然提交来自第一个命令的数据。我需要显式回滚吗?或者在使用 SqlDataAdapter.Update 时 TransactionScope 应该如何表现?
需要注意的是,最初我在 TransactionScope using 语句中创建了 SqlConnection,但我将它移出,因为我收到错误,即我的数据库服务器没有为分布式事务正确配置。我的 SqlConnection 创建与 TransactionScope 无关吗?