c#中使用数据库事务保证数据一致性

背景

在数据库中使用事务(Transaction)可以确保多个 SQL 操作要么全部成功,要么全部失败。为了实现所需的效果(插入和更新),可以将两个 SQL 语句包装在一个事务中。在事务中执行时,如果出现任何错误,可以回滚事务,确保数据库状态的一致性

代码示例

public string GetRepaired(dynamic obj)
{
    // 设置数据库连接字符串
    DbHelperSQL.connectionString = Const.g_Sqlstring;

    // 开始事务
    using (var connection = new SqlConnection(DbHelperSQL.connectionString))
    {
        // 打开连接
        connection.Open();

        // 开始一个事务
        using (var transaction = connection.BeginTransaction())
        {
            try
            {
                // 查 产线和轧辊类型
                string str = $"SELECT Line, RollType FROM [JT_DX_RollShop].[dbo].[Bearing] WHERE BearingID = '{obj.data.BearingID}'";
                DataTable dt = DbHelperSQL.Query(str, transaction); // 使用事务对象传递给查询

                string Line = dt.Rows[0]["Line"].ToString();
                string RollType = dt.Rows[0]["RollType"].ToString();

                // 插入问题解决记录
                string insertSql = $"INSERT INTO [dbo].[ProblemSolution] " +
                                   $"([BearingID], [Date], [Recorder], [Unit], [problem], [status], [Line], [RollType]) " +
                                   $"VALUES ('{obj.data.BearingID}', '{obj.data.Date}', '{obj.data.Recorder}', '{obj.data.Unit}', '{obj.data.problem}', '{obj.data.status}', '{Line}', '{RollType}')";

                // 执行插入
                DbHelperSQL.ExecuteNonQuery(insertSql, transaction); // 使用事务执行

                // 更新 Bearing 表状态
                string updateSql = $"UPDATE [JT_DX_RollShop].[dbo].[Bearing] " +
                                   $"SET State = '检修完' " +
                                   $"WHERE BearingID = '{obj.data.BearingID}'";

                // 执行更新
                DbHelperSQL.ExecuteNonQuery(updateSql, transaction); // 使用事务执行

                // 提交事务
                transaction.Commit();

                // 如果事务成功提交,返回成功状态
                return "操作成功";
            }
            catch (Exception ex)
            {
                // 出现异常时回滚事务
                transaction.Rollback();
                // 返回异常信息或处理异常
                return $"操作失败: {ex.Message}";
            }
        }
    }
}

代码解析

  1. 打开数据库连接并开始事务

    • 使用 SqlConnection 对象连接数据库。
    • 使用 connection.BeginTransaction() 开始一个事务。
  2. 查询产线和轧辊类型

    • DbHelperSQL.Query() 方法是查询数据库的,传入了事务对象 transaction,以确保查询操作也在事务范围内执行。
  3. 插入数据

    • 使用 DbHelperSQL.ExecuteNonQuery() 执行 SQL 插入操作,并传入事务对象 transaction,确保插入操作也在事务内。
  4. 更新数据

    • 同样,使用 DbHelperSQL.ExecuteNonQuery() 执行 SQL 更新操作,并传入事务对象。
  5. 提交事务

    • 如果没有发生异常,调用 transaction.Commit() 提交事务,所有操作将永久生效。
  6. 异常处理与回滚事务

    • 如果在任何一个操作中发生异常,会捕获该异常并调用 transaction.Rollback() 来回滚事务,这样就不会对数据库产生部分更改。
  7. 返回状态

    • 如果操作成功,返回 "操作成功";如果发生异常,返回异常信息。

DbHelperSQL 方法的修改

确保 DbHelperSQL.Query()DbHelperSQL.ExecuteNonQuery() 方法支持传入事务对象。你可以通过以下方式对这些方法进行修改:

public static DataTable Query(string sql, SqlTransaction transaction)
{
    using (var cmd = new SqlCommand(sql, transaction.Connection, transaction))
    {
        using (var da = new SqlDataAdapter(cmd))
        {
            DataTable dt = new DataTable();
            da.Fill(dt);
            return dt;
        }
    }
}

public static int ExecuteNonQuery(string sql, SqlTransaction transaction)
{
    using (var cmd = new SqlCommand(sql, transaction.Connection, transaction))
    {
        return cmd.ExecuteNonQuery();
    }
}

这样,所有数据库操作都在同一个事务内执行,确保了数据的一致性和完整性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值