编辑
2025-09-22
C#
00

目录

摘要
正文

摘要

事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元。它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。 举个例子,我们经常用到的 ATM 存取款机,比如转账的时候,是先减去转出账户的金额,然后再在指定转入账户的金额加上转出的金额。如果刚好这个时候转出的操作已经执行完成,但是由于系统的故障,导致转入的操作失败了。那么怎么办?这就需要用到事务了,只要事务里面有一条命令未成功执行,那么数据就会回滚到事务开始之前的状态。

正文

在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务。若要执行事务,请执行下列操作:

  1. 调用Connection 对象的BeginTransaction 方法来标记事务的开始。
  2. 将Transaction 对象分配给要执行的Command的Transaction 属性。
  3. 执行所需的命令。
  4. 调用Transaction 对象的Commit 方法来完成事务,或调用Rollback 方法来取消事务。 当然ADO.NET事务处理有优点和缺点,运用起来看具体情况了。

优点: – 简单性 – 和数据据事务差不多的快 – 独立于数据库,不同数据库的专有代码被隐藏了

缺点: – 事务不能跨越多个数据库连接 – 事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接。

image.png

C#
private void btnRun_Click(object sender, EventArgs e) { string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["DataConnString"].ToString(); using (SqlConnection conn = new SqlConnection(ConnectionString)) { conn.Open(); SqlTransaction transaction = conn.BeginTransaction(); try { string sql = "INSERT INTO wms_material(id, material_no, mlfb, description, repair_type, location, actual_qty, qty) " + "VALUES (@id, @material_no, @mlfb, @description, @repair_type, @location, @actual_qty, @qty)"; SqlCommand sqlcom = new SqlCommand(sql, conn); sqlcom.Transaction = transaction; sqlcom.Parameters.Add(new SqlParameter("@id", Guid.NewGuid())); sqlcom.Parameters.Add(new SqlParameter("@material_no", "A")); sqlcom.Parameters.Add(new SqlParameter("@mlfb", "mlfb")); sqlcom.Parameters.Add(new SqlParameter("@description", "A_1")); sqlcom.Parameters.Add(new SqlParameter("@repair_type", "维修")); sqlcom.Parameters.Add(new SqlParameter("@location", "BJ")); sqlcom.Parameters.Add(new SqlParameter("@actual_qty", 10)); sqlcom.Parameters.Add(new SqlParameter("@qty", 1)); sqlcom.ExecuteNonQuery(); sqlcom.Parameters.Clear(); sqlcom.Parameters.Add(new SqlParameter("@id", Guid.NewGuid())); sqlcom.Parameters.Add(new SqlParameter("@material_no", "A1")); sqlcom.Parameters.Add(new SqlParameter("@mlfb", "mlfb111mlfb111111111111111111111mlfb111mlfb11111111111111111111111111111")); sqlcom.Parameters.Add(new SqlParameter("@description", "A_2")); sqlcom.Parameters.Add(new SqlParameter("@repair_type", "维修")); sqlcom.Parameters.Add(new SqlParameter("@location", "BJ")); sqlcom.Parameters.Add(new SqlParameter("@actual_qty", 20)); sqlcom.Parameters.Add(new SqlParameter("@qty", 1)); sqlcom.ExecuteNonQuery(); transaction.Commit(); } catch(Exception ex) { transaction.Rollback(); } } }

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!