1、NET事务.net事务1- (SqlTransaction) 目录1. 概述2. 应用程序事务和数据库管理系统事务的区别1. 论述2. 数据的迁移3. 后期的维护4. 建议3. 代码1. OperateDataBase类2. main所在类控制台应用程序4. 应用SqlTransaction时三层架构中的代码分布5. 总结概述 .net开发程序中,使用事务的方法有4中,分别为:数据库管理系统中的事务(SQL代码) ;.net中的SqlTransaction;.net中的Com+事务;.net中的TransactionScope。 对于数据库管理系统中的事务和Com+事务,在这里就不讲,主要讲解
2、的为SqlTransaction和TransactionScope,本片博客讲解的是SqlTransaction,下一篇博客讲解TransactionScope,接下了接入我们本片博客的主题:SqlTransaction。应用程序事务和数据库管理系统事务的区别 论述 概述中已经讲解了.net开发中实现事务的几种方式,当然,如果我们从另一个角度上看,事务的实现就两种方式:应用程序事务和数据库管理系统事务。 应用程序事务是在应用程序中通过代码控制事务的开启,数据库管理系统的事务主要是通过书写存储过程来创建的,两种方式都可以实现事务,但是,从数据库的迁移和应用程序后期的维护上说,应用程序事务更好,当
3、然,凑够效率上说,事务写在数据库管理系统上更好,但是从它的缺点和现在计算机的硬件发展来说,显然它的这个优点不太突出了。 数据的迁移 事务写在数据库管理系统上时,如果你想将该数据库(MS SQL)搬迁到Oracle数据库管理系统上,那么其事务(存储过程)可能在Oracle中不兼容(系统提供的方法等不全部一样),但是,如果你将事务写在程序中就不存在这种情况。 后期的维护 用到事务的时候,最简单的也是多个表的操作(一个表的操作没有意义),意思就是说,事务的逻辑性很强,如果我们将事务写在数据库管理系统上,那么开发人员再看程序代码的时候,是无法清楚的了解事务内部的逻辑的,此时矛盾出现了,因为有时,我们维
4、护人员不得不去了解这种逻辑,这样的话,我们还要查看里面相应的T-Sql语句,是一个非常麻烦的过程,但是,如果我们将事务写在应用程序中,那么我们在看代码的过程中就已经把事务中的逻辑了解了,因为应用程序中事务的逻辑是通过应用程序代码 建议 那种不会学哪种,两种都不会,先学数据库中的事务,都会之后,用应用程序中的事务。代码 OperateDataBase类csharp view plaincopyprint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.Linq;4. usingSystem.Text;5. usin
5、gSystem.Threading.Tasks;6. usingSystem.Data;7. usingSystem.Data.SqlClient;8. usingSystem.Configuration;9. 10. namespace事务.普通事务11. 12. publicclassOperateDataBase13. 14. #region创建SqlConnection15. publicSqlConnectionCreateSqlConnection()16. SqlConnectionsqlCon=newSqlConnection(ConfigurationManager.Conn
6、ectionStringsstrCon.ToString();17. sqlCon.Open();18. returnsqlCon;19. 20. #endregion21. 22. #region添加数据23. publicintExecute(SqlConnectionsqlCon,stringstrSql,SqlTransactiontran)24. SqlCommandsqlCmd=newSqlCommand(strSql,sqlCon,tran);25. returnsqlCmd.ExecuteNonQuery();26. 27. #endregion28. 29. using Sy
7、stem;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() SqlConnect
8、ion 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.ExecuteN
9、onQuery(); #endregion main所在类(控制台应用程序)csharp view plaincopyprint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.Linq;4. usingSystem.Text;5. usingSystem.Threading.Tasks;6. usingSystem.Data.SqlClient;7. 8. namespace事务.普通事务9. 10. classProgram11. 12. staticvoidMain(stringargs)13. 14. O
10、perateDataBaseoperateDataBase=newOperateDataBase();15. using(SqlConnectionsqlCon=operateDataBase.CreateSqlConnection()16. 17. /开启事务18. SqlTransactiontran=sqlCon.BeginTransaction();19. stringstrSql1=insertintoDataTable1(id,name)values(21,张三);20. stringstrSql2=insertintoDataTable2(id,name)values(21,张三
11、);21. try22. 23. operateDataBase.Execute(sqlCon,strSql1,tran);24. operateDataBase.Execute(sqlCon,strSql2,tran);25. /提交事务26. tran.Commit();27. 28. catch(Exception)29. 30. /回滚事务31. tran.Rollback();32. 33. 34. 35. 36. 37. using System;using System.Collections.Generic;using System.Linq;using System.Text
12、;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();
13、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(); 应用SqlTrans
14、action时,三层架构中的代码分布 上面的也讲到过,应用在一张表的事务几乎很少见,大多都是多张表,但是由于SqlTransaction的特殊性,事务的范围在连接对象内,所以,在三层架构中应用该类的时候,应该在B层进行事务的控制,B层给D的东西,多了一个数据库连接对象和事务对象,此时需要注意,数据库连接对象是在D层创建的,只不过他先返回到了B层。总结.NET分布式事务2-TransactionScop 目录1. 概述2. 开启DTC服务1. 方式一2. 方式二3. 设置MSDTC4. 防火墙设置5. 数据库管理系统设置6. 代码1. 控制台代码2. OperateDataBasecs类同一数据
15、库服务器不同数据库3. OperateDifferentDataBaseServercs不同数据库系统7. 简单原理的介绍8. 总结概述 SqlTransaction可以解决同一个数据库的事务控制,但是,不能解决不同数据库的事务控制,今天就说一说,这个的解决方法,即:TransactionScope的应用。 本篇博客的的思路就是先进行一些相应的配置(开启DTC服务,配置MSDTC,配置防火墙,配置数据库管理系统),然后再进行一个实例的展示(代码),最后进行简单原理的介绍和总结。 了解了本篇博客的流程和结构后,接下来就看相应具体的内容吧!开启DTC服务 方式一 计算机管理服务Distribute
16、d(分布式)Link Tracking Client属性开启 方式二 字符命令子界面输入:net start msdtc设置MSDTC 命令界面输入:dcomcnfg.exe(或者:控制面板管理工具组件服务)防火墙设置 有两种方法:1、直接关闭防火墙(不建议使用,以前数据库连接的时候这样干过);2、进行如下图的设置数据库管理系统设置 因为要实现多个数据库系统之间事务的控制,所以,数据库系统也需要做相应的设置,具体如下图。代码 下面是一个简单的Demo,实现了两个功能:1、同一数据库系统,不同数据库的事务控制;2、不同数据库系统的事务控制。 控制台代码csharp view plaincopyp
17、rint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.Linq;4. usingSystem.Text;5. usingSystem.Threading.Tasks;6. usingSystem.Transactions;7. 8. namespace事务.分布式9. 10. classProgram11. 12. staticvoidMain(stringargs)13. 14. #region同一个数据库服务器,操作不同的数据库15. /using(TransactionScopetran=newTran
18、sactionScope()16. /17. /OperateDataBaseoperateDataBase=newOperateDataBase();18. /inti=operateDataBase.Execute1();19. /intj=operateDataBase.Execute2();20. /tran.Complete();21. /22. #endregion23. 24. #region不同的数据库服务器25. using(TransactionScopetran=newTransactionScope()26. 27. 28. OperateDifferentDataBa
19、seServeroperateDifferentDataBaseServer=newOperateDifferentDataBaseServer();29. inti=operateDifferentDataBaseServer.Execute1();30. intj=operateDifferentDataBaseServer.Execute2();31. tran.Complete();32. 33. #endregion34. 35. 36. using System;using System.Collections.Generic;using System.Linq;using Sys
20、tem.Text;using System.Threading.Tasks;using System.Transactions;namespace 事务.分布式 class Program static void Main(string args) #region 同一个数据库服务器,操作不同的数据库 /using (TransactionScope tran = new TransactionScope() / / OperateDataBase operateDataBase = new OperateDataBase(); / int i = operateDataBase.Execut
21、e1(); / int j = operateDataBase.Execute2(); / tran.Complete(); / #endregion #region 不同的数据库服务器 using (TransactionScope tran = new TransactionScope() OperateDifferentDataBaseServer operateDifferentDataBaseServer = new OperateDifferentDataBaseServer(); int i = operateDifferentDataBaseServer.Execute1();
22、 int j = operateDifferentDataBaseServer.Execute2(); tran.Complete(); #endregion OperateDataBase.cs类(同一数据库服务器,不同数据库)csharp view plaincopyprint?1. usingSystem;2. usingSystem.Collections.Generic;3. usingSystem.Linq;4. usingSystem.Text;5. usingSystem.Threading.Tasks;6. usingSystem.Data;7. usingSystem.Da
23、ta.SqlClient;8. usingSystem.Configuration;9. 10. namespace事务.分布式11. 12. publicclassOperateDataBase13. 14. privateSqlConnectionsqlCon1;15. privateSqlConnectionsqlCon2;16. privateSqlCommandsqlCom;17. 18. #region数据库系统1数据库1连接对象19. privatevoidGetConnection1()20. if(sqlCon1=null)21. 22. sqlCon1=newSqlConn
24、ection(ConfigurationManager.ConnectionStringsstrCon1.ToString();23. 24. if(sqlCon1.State=ConnectionState.Closed)25. 26. sqlCon1.Open();27. 28. 29. #endregion30. 31. #region数据库系统1数据库2连接对象32. privatevoidGetConnection2()33. if(sqlCon2=null)34. 35. sqlCon2=newSqlConnection(ConfigurationManager.ConnectionStringsstrCon2.ToString();36. 37. if(sqlCon2.State=ConnectionState.Closed)38. 39. sqlCon2.Open();40. 41. 42. #endregion43
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1