AOD.NET实现数据库事物Transaction

在开始介绍文章主要内容前先简单说一下事务

1.事务介绍

  事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。

2.事务使用场景

  需要对数据库同时进行多条更新操作时!例如,电商平台的下单付款,银行转账之类的



  好了,这里就不对事物进行细说了,想了解更多与事务有关的详细知识可以去园子里搜索哈

  执行事务的步骤

  1.连接数据库,连接数据库后会返回一个SqlConnection对象,我这里在数据库连接后将其赋值给了一个全局的SqlConnection对象——_con

  2.用返回的SqlConnection对象用BeginTransaction()方法生产并开始一个事务对象。

  3.执行所有对数据库进行更改操作的Sql语句。

   在对数据库进行更改时需要用到SqlCommand,在用生成SqlCommand对象后必须给其绑定事务(Transaction),不绑定会报错。

     在这里需要注意的是所有SqlCommand对象绑定的SqlConnection必须是同一个SqlConection对象,所有SqlCommand对象绑定的事务对象必须是同一个事务对象。若没绑定相同的SqlConnection对象和SqlTransaction,事务便会如同虚设。

  4.所有Sql语句执行成功后SqlTransaction对象可使用Commit()方法提交事务,失败则用Rollback()回滚事务,将数据库回滚到第一天sql执行前的状态。

  5.关闭数据库连接,释放资源。

  话不多说搬Code,注释代码上都有,如有不明白的地方或是有更好的意见请在下方留言区留下你的评论

事务方法

public static int ModifyDatabaseTran(List<string> SqlStrList, List<SqlParameter[]> SqlParList) {
            int result = 0;
            //打开数据库连接
            SqlConnection con = OpenDatabase();
            //_con:全局SqlConnection对象
            //生成事物对象
            SqlTransaction tran = _con.BeginTransaction();
            try
            {
                //遍历并执行SqlStrList集合里面的Sql语句
                for (int i = 0; i < SqlStrList.Count; i++)
                {
                    //将Sql语句与其对应的SqlParameter[]绑定并生成SqlCommand对象
                    SqlCommand com = BulidCommand(SqlStrList[i], SqlParList[i]);
                    //给SqlCommand对象绑定事务,必须绑定同一个事务对象否则跑不出事务效果
                    com.Transaction = tran;
                    //返回受影响的行数
                    result = com.ExecuteNonQuery();
                }
                //若最后执行的sql是插入语句result的值便=0,这里将其值改为1告诉调用者sql语句执行成功
                if (result == 0) result = 1;
                //所有Sql语句执行成功后提交事务
                tran.Commit();

            }
            catch (Exception)
            {
                //SqlStrList集合里面有一条Sql语句执行失败便执行事务回滚操作,回滚后报错Sql语句之前执行的Sql语句都将无效
                //同时数据库恢复SqlStrList集合里面的Sql语句执行前的状态          result=0;
                tran.Rollback();

            }
            finally
            {
                //关闭数据库连接,释放资源
                if (_con != null && _con.State != ConnectionState.Closed) {
                    _con.Close();
                    con.Dispose();
                }
                tran.Dispose();

            }
            //返回结果 0:失败,1:成功
            return result;
        }

打开数据库连接的方法

//数据库连接字符串
        private const string conStr = "server=.;database=Food;uid=sa;pwd=123456";

        private static SqlConnection _con;

        /// <summary>
        /// 打开数据库连接
        /// </summary>
        /// <returns></returns>
        private static SqlConnection OpenDatabase() {
            if (_con == null || _con.State == ConnectionState.Closed)
            {
                _con = new SqlConnection(conStr);
                _con.Open();
            }
            return _con;
        }

生产SqlCommand对象方法

/// <summary>
        /// 参数化查询绑定参数
        /// </summary>
        /// <param name="sqlStr"></param>
        /// <param name="SqlPar"></param>
        /// <returns></returns>
        private static SqlCommand BulidCommand(string sqlStr,SqlParameter[] SqlPar) {
            SqlConnection con = OpenDatabase();
            SqlCommand com = new SqlCommand(sqlStr, con);
            com.Parameters.AddRange(SqlPar);
            return com;
        }

实例

下面例子本来是想用winform写个注册,结界觉着拖控件太麻烦了,索性就直接在代码里面写sql了

页面(输入框可以自动忽略,这里只用到了按钮的点击事件)

执行操作前的member表状态

注册按钮点击事件代码(页面控件是从登陆页面复制过来的注册按钮的Name属性没有更改所以事件名称是LoginBtn_Click而不是RegisterBtn_Click)

private void LoginBtn_Click(object sender, EventArgs e)
        {
            List<string> sqlStr = new List<string>
            {
                { @"insert member values(@MemberAccount,@Password)"},
                { @"insert member values(@MemberAccount,@Password)"}
            };
            List<SqlParameter[]> sqlPar = new List<SqlParameter[]>
            {
                new SqlParameter[] { new SqlParameter("@MemberAccount","lei1"), new SqlParameter("@Password", "123456") },
                new SqlParameter[] { new SqlParameter("@MemberAccount","lei2"), new SqlParameter("@Password", "123456") }
            };

            int result=DBHlep.ModifyDatabaseTran(sqlStr,sqlPar);
            if (result > 0)
            {
                MessageBox.Show("成功!");
            }
            else {
                MessageBox.Show("失败!");
            }
        }

点击注册按钮后我们再来看看member表状态

上面的是Sql语句不报错的执行结果,接下来,我们将第二条sql语句的表名从menber改为menber1,看看member表的数据会发生什么变化

PS:我的数据库里面没有表member1所以第二条sql必定会执行失败,第二条sql失败后我们看看表member是否新增了一条数据(第一条sql是正确的,只修改了第二条sql的表名),新增了一条数据则事务执行失败,反之事务执行成功

private void LoginBtn_Click(object sender, EventArgs e)
        {
            List<string> sqlStr = new List<string>
            {
                { @"insert member values(@MemberAccount,@Password)"},
                //将第二条sql的表名修改为member1
                { @"insert member1 values(@MemberAccount,@Password)"}
            };
            List<SqlParameter[]> sqlPar = new List<SqlParameter[]>
            {
                new SqlParameter[] { new SqlParameter("@MemberAccount","lei1"), new SqlParameter("@Password", "123456") },
                new SqlParameter[] { new SqlParameter("@MemberAccount","lei2"), new SqlParameter("@Password", "123456") }
            };

            int result=DBHlep.ModifyDatabaseTran(sqlStr,sqlPar);
            if (result > 0)
            {
                MessageBox.Show("成功!");
            }
            else {
                MessageBox.Show("失败!");
            }
        }

点击注册按钮后看表member的数据是否发生了变化

member表数据未发生变化,事务执行成功!

好了,这篇博客到这里就结束了,如有不明白之处或是有更好的意见请在下方留言区留下你的评论

原文地址:https://www.cnblogs.com/121317RBN/p/10054308.html

时间: 2024-10-13 18:08:51

AOD.NET实现数据库事物Transaction的相关文章

数据库事物四大特性-ACID

转载自:http://blog.csdn.net/logogcn/article/details/6828531 事务的:原子性.一致性.分离性.持久性 事物(transaction)是由一些列操作序列构成的执行单元,这些单元要么都做,要么不做,是一个不可分割的工作单元. 数据库事物的四个基本性质(ACID) 1.原子性(Atomicity) 指的是事物中包含的所有操作要么全做,要么全不做(all or none). 2.一致性(consistency) 在事物开始以前,数据库处于一致性的状态,

数据库事物

数据库的事物是神马? 事务(transaction)代表一组不可分割的操作,要么全部执行,要么全部不执行, transaction起始于一条DML语句,结束于commit;语句,或者是DCL.DDL语句,在事务未提交前 可以通过rollback回滚事务,正常退出事务会自动提交,非正常退出事务会自动回滚. 北大SQL数据库视频教程事务04 - 视频教程在线观看v.ku6.com/show/E0qbiVBfaErPqdpx.html oracle数据库_DML与事务控制- 视频教程在线观看v.ku6

SpringBoot事物Transaction实战讲解教程

前言 本篇文章主要介绍的是SpringBoot的事物Transaction使用的教程. SpringBoot Transaction 说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码. Transaction 事务管理方式 在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式. 编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager.对于编程式事务管理,spr

数据库事物隔离级别通俗理解

转自:http://www.oschina.net/question/258230_134502 总的说,数据库事物无非就两种:读取事物(select).修改事物(update,insert).在没有事物隔离控制的时候,多个事物在同一时刻对同一(数据的操作可能就会影响到最终期望的结果,通常有四种情况 (1) 两个更新事物同时修改一条数据时,很显然这种情况是最严重的了,程序中无论如何也不能出现这种情况,因为它会造成更新的丢失!通俗的讲,我更新时,你丫也更新这不就出问题了吗,艹,不行! (2) 一个

django中数据库事物的管理

事务(Transaction)是并发控制的基本单位.所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行.所以,应该把他们看成一个事务.事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性. 在django1.8中事务的使用  注意:只要是已报异常,程序就自动回滚了.. from django.db import transaction #首先要导包 @

数据库事物操作

事务 什么是事务?转账:1. 给张三账户减1000元2. 给李四账户加1000元 当给张三账户减1000元后,抛出了异常!这会怎么样呢?我相信从此之后,张三再也不敢转账了. 使用事务就可以处理这一问题:把多个对数据库的操作绑定成一个事务,要么都成功,要么都失败! ========================================================================================== 事物的特性:ACID * 原子性:事务中所有操作是不可

监控数据库事物运行情况

SELECT DBT.DATABASE_ID, DB_NAME(DBT.DATABASE_ID) '数据库名', DBT.TRANSACTION_ID, AT.NAME, AT.TRANSACTION_BEGIN_TIME, CASE AT.TRANSACTION_TYPE WHEN 1 THEN '读/写事务' WHEN 2 THEN '只读事务' WHEN 3 THEN '系统事务' WHEN 4 THEN '分布式事务' END 'TRANSACTION类型', CASE AT.TRANS

彻底理解数据库事物

事务 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).在计算机术语中,事务通常就是指数据库事务. 概念 一个数据库事务通常包含对数据库进行读或写的一个操作序列.它的存在包含有以下两个目的: 1.为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法.2.当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰.

数据库 事物 锁

事物中的锁简单说就是S共享锁,X排它锁 X锁在所有事物中,一旦加上,持续到COMMIT才释放 未提交读 (READ UNCOMMITTED):读取时候不会加共享锁,直接读取 已提交读(READ COMMITTED):读取时候加S锁,读完立马释放S锁,会在事物完成前就立马释放S锁 可重复读(REPEATABLE READ):读取时候加S锁,一直持续到事物提交才会释放S锁,如果中间有数据插入,改模式会读取到插入的数据,会出现幻想 可序列化(SERIALIZABLE):读取时候加S锁,一直持续到事物提