在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。
1 SQL事务
    sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)

带事务的存储过程
CREATE PROCEDURE dbo.SPTransaction
    (
    @UpdateID int,
    @UpdateValue nchar(50),
    @InsertID int,
    @InsertValue nchar(50)
    )
AS
begin Tran
Update Region  Set RegionDescription=@UpdateValue where RegionID=@UpdateID

insert into Region Values (@InsertID,@InsertValue)

declare @RegionError int
select @RegionError=@@error
if(@RegionError=0)
COMMIT Tran
else
ROLLBACK Tran
GO
执行带事务的存储过程
/**//// <summary>
        /// SQL事务:
        /// </summary>
        public void SQLTran()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
            SqlCommand cmd = new SqlCommand();
            cmd.CommandText = "SPTransaction";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;
            conn.Open();
            SqlParameter[] paras= new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
            paras[0].Value = "2";
            paras[1].Value = "Update Value1";
            paras[2].Value = "6";
            paras[3].Value = "Insert Value1";
            foreach (SqlParameter para in paras )
            {
                cmd.Parameters.Add(para);
            }
            cmd.ExecuteNonQuery();   
        }

2 ADO.net事务
   Ado.net事务可能是大家一般都用的
 优点:简单,效率和数据库事务差不多。
 缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:

ADO.net事务
/**//// <summary>
        /// 一般的ADO.net 事务
        /// </summary>
        public void ADONetTran1()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
            SqlCommand cmd = new SqlCommand();
            try
            {
                cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = conn;
                conn.Open();
                SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                paras[0].Value = "2";
                paras[1].Value = "Update Value12";

                foreach (SqlParameter para in paras)
                {
                    cmd.Parameters.Add(para);
                }
                //开始事务
                cmd.Transaction = conn.BeginTransaction();
                cmd.ExecuteNonQuery();


                cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                cmd.CommandType = CommandType.Text;

                paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                paras[0].Value = "7";
                paras[1].Value = "Insert Value";

                cmd.Parameters.Clear();
                foreach (SqlParameter para in paras)
                {
                    cmd.Parameters.Add(para);
                }
                
                cmd.ExecuteNonQuery();
                //提交事务
                cmd.Transaction.Commit();
            }
            catch
            {
                //回滚事务
                cmd.Transaction.Rollback();
                throw;
            }
            finally
            {
                conn.Close();
            }

        }

3 TransactionScope事务
  TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
 优点:实现简单,同时能够自动提升为分布式事务
Demo:

TransactionScope事务
 /**//// <summary>
        /// TransactionScope事务:可自动提升事务为完全分布式事务的轻型(本地)事务。 
        /// 使用时要保证MSDTC服务(控制分布事务)是开启的可以使用:net start msdtc命令开启服务;
        /// </summary>
        public void ADONetTran2()
        {
             SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
             SqlCommand cmd = new SqlCommand();
            try
            {
              
                using (System.Transactions.TransactionScope ts = new TransactionScope())
                {
                    
                    cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = conn;
                    conn.Open();
                    SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                    paras[0].Value = "2";
                    paras[1].Value = "Update Value12";

                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }
                    cmd.ExecuteNonQuery();


                    cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                    cmd.CommandType = CommandType.Text;

                    paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                    paras[0].Value = "8";
                    paras[1].Value = "Insert Value";

                    cmd.Parameters.Clear();
                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }

                    cmd.ExecuteNonQuery();
                    //提交事务
                    ts.Complete();
                }
            }
            catch
            {
                throw;
            }
            finally
            {
                conn.Close();
            }

        }

4 COM+事务
  在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
Demo:

COM+事务
/**//// <summary>
        /// COM+事务
        /// </summary>
        public void ComTran()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
            SqlCommand cmd = new SqlCommand();
            ServiceConfig sc = new ServiceConfig();

            //指定事务类型
            sc.Transaction = TransactionOption.Required;
            //设置启动跟踪
            sc.TrackingEnabled = true;
            //创建一个上下文,该上下文的配置由作为 cfg 参数传递的 ServiceConfig 对象来指定。
            //随后,客户端和服务器端的策略均被触发,如同发生了一个方法调用。
            //接着,新的上下文被推至上下文堆栈,成为当前上下文
            ServiceDomain.Enter(sc);
            try
            {
                    cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = conn;
                    conn.Open();
                    SqlParameter[] paras = new SqlParameter[]{
                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
                    paras[0].Value = "2";
                    paras[1].Value = "Update Value22";

                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }
                    cmd.ExecuteNonQuery();


                    cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
                    cmd.CommandType = CommandType.Text;

                    paras = new SqlParameter[]{
                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
                    paras[0].Value = "9";
                    paras[1].Value = "Insert Value";

                    cmd.Parameters.Clear();
                    foreach (SqlParameter para in paras)
                    {
                        cmd.Parameters.Add(para);
                    }

                    cmd.ExecuteNonQuery();

                    //提交事务
                    ContextUtil.SetComplete();
            }
            catch
            {
                //回滚事务
                ContextUtil.SetAbort();
                throw;
            }
            finally
            {
                conn.Close();
                //触发服务器端的策略,随后触发客户端的策略,如同一个方法调用正在返回。
                //然后,当前上下文被弹出上下文堆栈,调用 Enter 时正在运行的上下文成为当前的上下文。
                ServiceDomain.Leave();
            }

        }

在.net中还有些也能进行事务处理,如web Service中

需要特别补充的是:
如果你使用的是分布事务(TransactionScope事务和COM+事务),在默认情况下你是要重新配置安装SQL Server数据库服务器和访问数据库的客户端的.(如果没有配置运行会出现以下错误:该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
)下面是MSDN上关于配置分布式事务的一段原话:
配置分布式事务
要启用分布式事务,可能需要通过网络启用 MS DTC,以便在使用应用了最新的 Service Pack 的较新操作系统(例如 Windows XP 或 Windows 2003)时使用分布式事务。如果启用了 Windows 防火墙(Windows XP Service Pack 2 的默认设置),必须允许 MS DTC 服务使用网络或打开 MS DTC 端口。
实际怎么配置呢,经过我的实际使用:大致如下:打开'控制面板'->'管理工具'->'组件服务',点开'组件服务'->'计算机'->'我的电脑',在'我的电脑'上右击属性,点'MSDTC',然后点'安全性配置'。作为数据库的服务器的配置如下:

而访问数据库的客户端的配置和服务器端的稍有些差别:


在设置完上面的还有使防火墙MS DTC 服务使用网络或打开 MS DTC 端口:运行netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable命令就可以了

转载于:https://www.cnblogs.com/ruinet/archive/2007/07/15/818604.html

.net中的4种事务总结相关推荐

  1. Spring中七种事务传播行为

    事务的传播行为,默认值为 Propagation.REQUIRED.可手动指定事务传播行为,如下: 1.Propagation.REQUIRED 1)若嵌套在事务中,则加入该事务. 2)若没有嵌套在事 ...

  2. 4种事务特性,5种隔离级别,7种传播行为

    去面试,面试官问,说一下spring事务的几种隔离级别,你项目用的是哪个.一脸茫然,之后...... 什么是事务? 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 事务 ...

  3. 聊聊 Linux 中的五种 IO 模型

    聊聊 Linux 中的五种 IO 模型 2016/04/21 · IT技术 · 8 评论 · iO, 同步, 异步, 阻塞, 非阻塞 分享到:0 本文作者: 伯乐在线 - 陶邦仁 .未经作者许可,禁止 ...

  4. 面试官:你知道哪几种事务失效的场景?

    前言 声明式事务是Spring功能中最爽之一,可是有些时候,我们在使用声明式事务并未生效,这是为什么呢? 今天陈某带大家来聊一聊声明事务的几种失效场景.本文将会从以下两个方面来说一下事务为什么会失效? ...

  5. 04-JDBC学习手册:JDBC中使用transaction(事务)编程和Javabean定义

    JDBC中使用 Transaction(事务)编程 1 事务的四大特性 事务是具备以下特征(ACID) 的工作单元: (1) 原子性 事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所 ...

  6. MySQL-InnoDB究竟如何巧妙实现,4种事务的隔离级别

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  7. 浅谈MySQL数据库中的锁与事务

    MySQL中的锁与锁策略 在MySQL中,为了应对并发场景下的读写,锁通常分为两类:共享锁以及排他锁.其中,共享锁允许多个连接在同一时间并发的读取相同的资源,彼此之间互不影响,所以又称为读锁.排他锁则 ...

  8. spring 七种事务

    七种事务类型: 1.propagation_required:支持当前事务,无事务,另起新事物 2.propagation_required-new:新建事务,若有旧事务,挂起. 3.propagat ...

  9. mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

最新文章

  1. Linux 静态库 动态库
  2. 模拟进程创建、终止、阻塞、唤醒原语_操作系统基础8-进程及进程控制
  3. Redis工作笔记-Sorted-Sets类型
  4. 基于javaweb+jsp+mysql的美容院管理系统
  5. 提取字符串中字母数字方法
  6. LINUX加载静态库so,取得函数地址并调用
  7. 20191124每日一句
  8. XPS查看器(XPS Viewer)适用Win10系统安装说明
  9. 完成类似百度贴吧客户端tableview滑动效果
  10. android 标签云圆形,JavaScript实现的圆形浮动标签云效果实例
  11. python 拼音输入法_隐马尔科夫模型python实现简单拼音输入法
  12. android水下气泡,科学网—水下爆炸气泡的基本现象及规律 - 黄超的博文
  13. Android手机应用开发之手机GPS定位
  14. 《雍正皇帝》文化专有词翻译策略的研究现状(Baker)
  15. 服务器端测试常用linux命令
  16. rust油桶用什么打_文明重启油桶获取使用攻略_文明重启油桶怎么获取和使用_玩游戏网...
  17. 数字地图制作原则细节
  18. DC/DC电路自举电容作用
  19. Java 集合深入理解(10):Deque 双端队列
  20. 微信小游戏云开发数据库

热门文章

  1. 【机器学习】SVM学习(三):线性分类器的求解
  2. 机器学习知识点(三十六)分类器性能度量指标f1-score
  3. 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七
  4. Python入门IDE选择
  5. Windows 7 下直接硬盘安装 Ubuntu 10.04成为双系统的方法
  6. Java基础类库四则运算_00JAVA语法基础_四则运算 01
  7. Dwg图纸属性的读取
  8. Python 技术篇-不使用os模块遍历文件夹,pathlib库获取直接下级文件和所有下级文件
  9. DbVisualizer Personal 7.0 数据库连接工具免安装版本获取,直接解压即可使用!
  10. windows 技术篇-判断某个ip地址相对于自己的主机是内网ip还是外网ip实例演示