概述
.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层。