.net事务(1、SqlTransaction)

概述

        .net开发程序中,使用事务的方法有4中,分别为:数据库管理系统中的事务(SQL代码)   ;.net中的SqlTransaction;.net中的Com+事务;.net中的TransactionScope。
        对于数据库管理系统中的事务和Com+事务,在这里就不讲,主要讲解的为SqlTransaction和TransactionScope,本片博客讲解的是SqlTransaction,下一篇博客讲解TransactionScope,接下了接入我们本片博客的主题:SqlTransaction。

应用程序事务和数据库管理系统事务的区别

       论述 

            概述中已经讲解了.net开发中实现事务的几种方式,当然,如果我们从另一个角度上看,事务的实现就两种方式:应用程序事务和数据库管理系统事务。

           应用程序事务是在应用程序中通过代码控制事务的开启,数据库管理系统的事务主要是通过书写存储过程来创建的,两种方式都可以实现事务,但是,从数据库的迁移和应用程序后期的维护上说,应用程序事务更好,当然,凑够效率上说,事务写在数据库管理系统上更好,但是从它的缺点和现在计算机的硬件发展来说,显然它的这个优点不太突出了。

       数据的迁移 

              事务写在数据库管理系统上时,如果你想将该数据库(MS SQL)搬迁到Oracle数据库管理系统上,那么其事务(存储过程)可能在Oracle中不兼容(系统提供的方法等不全部一样),但是,如果你将事务写在程序中就不存在这种情况。

        后期的维护

               用到事务的时候,最简单的也是多个表的操作(一个表的操作没有意义),意思就是说,事务的逻辑性很强,如果我们将事务写在数据库管理系统上,那么开发人员再看程序代码的时候,是无法清楚的了解事务内部的逻辑的,此时矛盾出现了,因为有时,我们维护人员不得不去了解这种逻辑,这样的话,我们还要查看里面相应的T-Sql语句,是一个非常麻烦的过程,但是,如果我们将事务写在应用程序中,那么我们在看代码的过程中就已经把事务中的逻辑了解了,因为应用程序中事务的逻辑是通过应用程序代码

        建议

                那种不会学哪种,两种都不会,先学数据库中的事务,都会之后,用应用程序中的事务。


代码

       OperateDataBase类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace 事务.普通事务
{
    public class OperateDataBase
    {
        #region 创建SqlConnection
        public SqlConnection CreateSqlConnection() {
            SqlConnection sqlCon = new SqlConnection(ConfigurationManager .ConnectionStrings ["strCon"].ToString ());
            sqlCon.Open();
            return sqlCon;
        }
        #endregion

        #region 添加数据
        public int Execute(SqlConnection sqlCon,string strSql,SqlTransaction tran) {
            SqlCommand sqlCmd = new SqlCommand(strSql, sqlCon, tran);
            return sqlCmd.ExecuteNonQuery();
        }
        #endregion
    }
}

       main所在类(控制台应用程序)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace 事务.普通事务
{
    class Program
    {
        static void Main(string[] args)
        {
            OperateDataBase operateDataBase = new OperateDataBase();
            using (SqlConnection sqlCon = operateDataBase.CreateSqlConnection())
            {
                //开启事务
                SqlTransaction tran = sqlCon.BeginTransaction();
                string strSql1 = "insert into DataTable1(id,name) values(21,'张三')";
                string strSql2 = "insert into DataTable2(id,name) values(21,'张三')";
                try
                {
                    operateDataBase.Execute(sqlCon, strSql1, tran);
                    operateDataBase.Execute(sqlCon, strSql2, tran);
                    //提交事务
                    tran.Commit();
                }
                catch (Exception)
                {
                    //回滚事务
                    tran.Rollback();
                }
            }
                
        }
    }
}

应用SqlTransaction时,三层架构中的代码分布

       上面的也讲到过,应用在一张表的事务几乎很少见,大多都是多张表,但是由于SqlTransaction的特殊性,事务的范围在连接对象内,所以,在三层架构中应用该类的时候,应该在B层进行事务的控制,B层给D的东西,多了一个数据库连接对象和事务对象,此时需要注意,数据库连接对象是在D层创建的,只不过他先返回到了B层。


总结

.net事务(1、SqlTransaction)_第1张图片

你可能感兴趣的:(.net事务(1、SqlTransaction))