C# 实现 SQL Server 事务处理详解与示例
在开发涉及多步骤数据库操作的应用程序时,事务(Transaction)是保障数据一致性的关键机制。本文将展示如何在 C# 环境中,使用 ADO.NET 技术栈连接 SQL Server 并执行本地事务。通过规范化的代码结构,实现业务逻辑中的“所有更新成功”或“错误回滚”,防止因部分失败导致的数据损坏。
事务处理的核心目标
在使用 C# 操作数据库时,往往需要连续执行多条 SQL 语句。如果中间某一步骤失败(如约束冲突、网络中断),已执行的语句不应保留,而应还原到操作前的状态。事务正是为此设计:它将多个操作视为一个不可分割的工作单元,要么整体提交(Commit),要么整体撤销(Rollback)。
环境准备
在执行代码前,请确保满足以下条件:
- 数据库服务:本地或远程已运行 Microsoft SQL Server 实例。
- 开发依赖:项目中需引用
System.Data.SqlClient命名空间(适用于 .NET Framework 及较旧版本的 .NET Core/5+)。若使用最新的Microsoft.Data.SqlClient,需对应调整引用包。 - 权限配置:用于连接的数据库用户拥有目标表(如示例中的 Region 表)的 Insert 权限。
第 1 步:建立安全连接与事务上下文
首先,通过 SqlConnection 建立连接,并利用 BeginTransaction 显式开启事务。此时数据库会话进入特殊模式,后续操作受该事务控制。
private static void ExecuteSqlTransaction(string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
// Start a local transaction.
transaction = connection.BeginTransaction("SampleTransaction");
// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;
第 2 步:构建并提交写入操作
接下来,在 try 代码块中执行具体的数据修改指令。本例演示向 Region 表中连续插入两条记录。若所有指令均执行无误,调用 transaction.Commit() 将变更永久保存到数据库。
try
{
command.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();
// Attempt to commit the transaction.
transaction.Commit();
Console.WriteLine("Both records are written to database.");
}
第 3 步:异常捕获与回滚机制
如果在执行插入过程中发生任何异常(如主键冲突或连接断开),流程将跳转至 catch 块。此时打印错误信息,并尝试调用 transaction.Rollback() 取消之前的所有更改。为确保稳定性,回滚操作本身也建议包裹在嵌套的 try-catch 中,以防回滚过程因底层连接关闭等原因再次报错。
catch (Exception ex)
{
Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
Console.WriteLine(" Message: {0}", ex.Message);
// Attempt to roll back the transaction.
try
{
transaction.Rollback();
}
catch (Exception ex2)
{
// This catch block will handle any errors that may have occurred
// on the server that would cause the rollback to fail, such as
// a closed connection.
Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
Console.WriteLine(" Message: {0}", ex2.Message);
}
}
} // 自动释放资源}
完成判断与注意事项
- 验证结果:当输出日志显示 "Both records are written to database." 时,确认两行数据已成功持久化;若出现 "Commit Exception",则说明数据未发生变化,处于原始状态。
- 资源管理:示例使用了
using语句块,这确保了无论是否发生异常,SqlConnection都会被正确关闭和释放,避免内存泄漏或数据库连接池耗尽。 - 命名规范:
BeginTransaction("SampleTransaction")中的字符串参数为事务名称(可选),便于在数据库系统表中追踪调试,实际生产环境中可根据业务类型命名。
以上就是 C# 实现 SQL Server 事务处理的详细内容,更多关于 C# 数据库编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













