.NetCore批量调用Mysql存储过程中的事务

.NetCore连接MySql

1、.NetCore项目连接Mysql首先需要导入NuGet依赖包。而Mysql的依赖包有许多种。例如:MySql.Data、Pomelo.EntityFrameworkCore.MySql。本文中使用的是Pomelo.EntityFrameworkCore.MySql,因为.NetCore可以使用EfCore与数据库进行交互,而EfCore需要EntityFrameworkCore支持的依赖包。
打开NuGet
首先在“解决方案资源管理器”中项目的依赖项中打开NuGet管理界面。
导入MySql依赖包
在预览界面搜索Mysql即可搜索到Mysql相关的依赖包、安装依赖包时需对应选择版本。.Net3.Net5.Net6安装的版本分别对应依赖包3.X.X5.X.X6.X.X

2、依赖包导入后将Mysql连接字符串配置进全局配置文件appsettings.json中。连接字符串的格式为:

**Server=[IP地址];Port=[端口];Database=[数据库名称];Uid=[数据库账号];Pwd=[数据库密码];charset=utf8;Allow User Variables=True**

注:需要Mysql对账号开放远程权限以及服务器防火墙开放端口号
Mysql连接字符串
3、MySqlConnection类与MySqlCommand类
MySql工具类
MySqlConnection类是与MySql数据库进行连接的工具类,通过MySql数据库连接字符串以及Open方法进行连接。
MySqlCommand类是MySql语句执行类,通过CommandText设置Sql语句,Parameters添加参数,ExecuteNonQuery或ExecuteReader执行语句。

.NetCore执行MySql存储过程

1、调用增删改存储过程代码如下:

			MySqlConnection myconn = new MySqlConnection();
            myconn = new MySqlConnection(ConfigHelper.GetConfig("ConnectionStrings:OprateConnection"));
            try
            {
                myconn.Open();
                MySqlCommand cmd = new MySqlCommand(ProcedureName, myconn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new MySqlParameter("key", "value"));
                int count = cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
				throw new Exception(ex.Message);
            }
            finally
            {
                myconn.Close();
                myconn.Dispose();
            }

其中ProcedureName为存储过程名称,存储过程如果需要参数则需要使用cmd.Parameters.Add(new MySqlParameter(“key”, “value”));
如果不带参数直接执行即可。返回结果为数据库中改动行数。

2、调用查询存储过程代码如下:

			MySqlConnection myconn = new MySqlConnection();
            myconn = new MySqlConnection(ConfigHelper.GetConfig("ConnectionStrings:OprateConnection"));
            try
            {
                myconn.Open();
                MySqlCommand cmd = new MySqlCommand(ProcedureName, myconn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new MySqlParameter("key", "value"));
                DataSet ds = new DataSet();
                MySqlDataAdapter md = new MySqlDataAdapter(cmd);
                md.Fill(ds);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                myconn.Close();
                myconn.Dispose();
            }

与增删改的区别为,需要使用MySqlDataAdapter将执行的结果填充至DataSet中。MySqlDataAdapter是MySql数据库与DataSet之间的连接器。
Fill()方法就是将数据填充进DataSet中。

增加事务

如果同一时间需要对数据库中多个表进行操作,或者需要对一个表中的多条数据进行操作。那么就应该用上事务。如果没有事务的话,中途发生异常的话,之前的操作不会回滚。就会产生脏数据。

事务就是一个程序执行单元,一个程序执行单元即无法拆分。要么成功,要么失败。
将多个操作放入一个事务中,所有操作要么同时成功,要么同时失败。就不会产生脏数据了。

批量增删改且带事务代码如下:

			MySqlConnection myconn = new MySqlConnection();
            MySqlTransaction transaction = null;
            myconn = new MySqlConnection(ConfigHelper.GetConfig("ConnectionStrings:OprateConnection"));
            try
            {
                myconn.Open();
                transaction = myconn.BeginTransaction();
                foreach (string ProcedureName in ProcedureNames)
                {
                    MySqlCommand cmd = new MySqlCommand(ProcedureName, myconn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Transaction = transaction;
                    cmd.Parameters.Add(new MySqlParameter("key", "value"));
                    cmd.ExecuteNonQuery();
                }
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw new Exception(ex.Message);
            }
            finally
            {
                myconn.Close();
                myconn.Dispose();
            }

MySqlTransaction为Mysql事务类。
transaction = myconn.BeginTransaction();表示事务开始
cmd.Transaction = transaction; 表示将操作添加至事务
transaction.Commit();表示事务执行提交
transaction.Rollback();表示事务回滚,撤销执行

事务总结

事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

数据库的存储过程中也可设置事务,使用到以下语句
BEGIN CONNECTION 事务开始
COMMIT 提交
ROLLBACK 回滚

如果不设置事务的话,每一句Sql语句执行都会默认有一个事务,且是自动提交的。而创建设置的事务都需要手动提交,即COMMIT。如果不使用COMMIT数据库中的数据并不会真正变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值