.NET开发中的事务处理大比拼

本文转载:http://www.cnblogs.com/jhxk/articles/2696307.html

http://liubaolongg.blog.163.com/blog/static/21386802201222631355218/

.NET事务

  • ADO.NET事务

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))
{
    conn.Open();
    using (SqlTransaction tran = conn.BeginTransaction())
    {
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            cmd.Transaction = tran;
            try
            {
                cmd.CommandText = sql1;
                cmd.ExecuteNonQuery();
                cmd.CommandText = sql2;
                cmd.ExecuteNonQuery();
                tran.Commit();
                Response.Write("Ok");
            }
            catch (SqlException ex)
            {
                tran.Rollback();
                Response.Write("Error:" + ex.Message);
            }
        }
    }
    conn.Close();
} 

    ADO.NET 显式事务占用资源少、速度快,但功能简单,只能管理单一对象和单一持久资源间的事务,比如想在数据库 B 插入失败,则回滚对数据库 A 的操作,就无法用这种 ADO.NET 显式事务来实现。 

  • 隐式事务(TransactionScope)

隐式事务不具有Commit、Roolback方法。

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))
{
    using (TransactionScope ts = new TransactionScope())
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            try
            {
                cmd.CommandText = "insert into TranTable(Priority) values(1)";
                cmd.ExecuteNonQuery();
                cmd.CommandText = "insert into TranTable(Priority) values(256)";
                cmd.ExecuteNonQuery();
                ts.Complete();
                Response.Write("Ok");
            }
            catch (SqlException ex)
            {
                Response.Write("Error:" + ex.Message);
            }
        }
    }
    conn.Close();
} 

    TransactionScope没有和数据库直接关联,那是怎么实现用事务的方式执行语句的呢?

    如果我们在连接字符串里面加上Enlist=false;,再执行上面的代码,发现插入了一条1的记录,说明并不是以事务方式执行的。Enlist默认为true,SqlClient会自动检测是否存在事务,如果有事务,则自动登记到事务中。

  • 显示事务(CommittableTransaction)

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))
{
    using (CommittableTransaction ct = new CommittableTransaction())
    {
        conn.Open();
        conn.EnlistTransaction(ct);//将连接登记到事务
        using (SqlCommand cmd = new SqlCommand())
        {
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;
            try
            {
                cmd.CommandText = "insert into TranTable(Priority) values(1)";
                cmd.ExecuteNonQuery();
                cmd.CommandText = "insert into TranTable(Priority) values(256)";
                cmd.ExecuteNonQuery();
                ct.Commit();
                Response.Write("Ok");
            }
            catch (SqlException ex)
            {
                ct.Rollback();
                Response.Write("Error:" + ex.Message);
            }
        }
    }
    conn.Close();
}

  • WebService(TransactionOption)

首先引用using System.EnterpriseServices;,然后设置属性TransactionOption = TransactionOption.Required。

设置TransactionOption.Disabled、TransactionOption.NotSupported、TransactionOption.Supported表示不参与事务。

设置TransactionOption.Required、TransactionOption.RequiresNew表示创建一个新的事务。意思是说当TransactionOption的属性为Required或 RequiresNew的WEB服务方法调用另一个TransactionOption的属性为Required或RequiresNew的WEB服务方法时,每个WEB服务方法将参与他们自己的事务,因为Web Service方法只能用作事务中的根对象。

PS:WEB服务方法的TransactionOption默认属性为Disabled

提交事务ContextUtil.SetComplete();

回滚事务ContextUtil.SetAbort();

[WebMethod(TransactionOption = TransactionOption.Required)]
public string HelloWorld()
{
    try
    {
        ContextUtil.EnableCommit();//开启事务
        SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=sa;database=db.mdf;");
        SqlCommand cmd = new SqlCommand("update users set name = ‘yangxing‘ where id = 5", con);
        con.Open();
        cmd.ExecuteNonQuery();
        cmd.CommandText = "update users1 set name = ‘yangxing1‘ where id = 6";//users1表不存在,执行该语句报错
        cmd.ExecuteNonQuery();//抛出异常
        ContextUtil.SetComplete();//提交事务
        return "true";
    }
    catch
    {
        ContextUtil.SetAbort();//回滚事务
        return "false";
    }
} 

  • 自动事务处理

在方法之前增加属性[AutoComplete(true)],这样如果方法执行时没有异常就默认提交,如果有异常则这个方法就会回滚。

using System;
using System.Data.SqlClient;
using System.EnterpriseServices;//企业级服务COM+事务
namespace ClassTran
{
    [Transaction(TransactionOption.Required)]
    public class OrderData2 : ServicedComponent
    {
        //自动事务
        [AutoComplete(true)]
        public string WorkTran()
        {
            string msg = "";
            string conString = "data source=127.0.0.1;database=codematic;
               user id=sa;password=";
            SqlConnection myConnection = new SqlConnection(conString);
            myConnection.Open();
            SqlCommand myCommand = new SqlCommand();
            myCommand.Connection = myConnection;
            try
            {
                myCommand.CommandText = "update P_Product set Name=‘电脑2‘
                     where Id=52";
                myCommand.ExecuteNonQuery();
                myCommand.CommandText = "update P_Product set Name=‘电脑3‘
                where Id=53";
                myCommand.ExecuteNonQuery();
                msg ="成功!";
            }
            catch (Exception ex)
            {
                msg = "失败:"+ex.Message;
            }
            finally
            {
                myConnection.Close();
            }
            return msg;
        }
    }
}

时间: 2024-10-13 23:54:54

.NET开发中的事务处理大比拼的相关文章

.NET开发中的事务处理---ADO.NET级别的事务

现在我们对事务的概念和原理都有所了解了,并且作为已经有一些基础的C#开发者,我们已经熟知编写数据库交互程序的一些要点,即: (1)使用SqlConnection类的对象的Open()方法建立与数据库服务器的连接. (2)然后将该连接赋给SqlCommand对象的Connection属性. (3)将欲执行的SQL语句赋给SqlCommand的CommandText属性. (4)通过SqlCommand对象进行数据库操作. 创建一个ADO.NET事务是很简单的,需要定义一个SqlTransactio

[Java Web]2\Web开发中的一些架构

1.企业开发架构: 企业平台开发大量采用B/S开发模式,不管采用何种动态Web实现手段,其操作形式都是一样的,其核心操作的大部分都是围绕着数据库进行的.但是如果使用编程语言进行数据库开发,要涉及很多诸如事务.安全等操作问题,所以现在开发往往要通过中间件进行过渡,即,程序运行在中间件上,并通过中间件进行操作系统的操作,而具体一些相关的处理,如事务.安全等完全由中间件来负责,这样程序员只要完成具体的功能开发即可. 2.Java EE架构: Java EE 是在 Java SE 的基础上构建的,.NE

java商城开发中说说影响java商城系统和jsp商城效率的原因

java是现在比较流行的软件开发语言,同时也是互联网应用中安全性相对较高的一种开发语言了.被很多的电子金融系统开发企业以及电子商务网站建设企业所看重.虽然说在如今的互联网开发中,它比较有优势,然而用得不当的话,反而会使电子商务网站建设的性能受到影响.电子商务网站建设企业,就从多年的java商城开发中说说影响java商城系统和jsp商城效率的原因. 1.缺乏正确的容量规划 容量规划是一个全面的和发展的过程标准,预测当前和未来的IT环境容量需求.制定合理的容量规划不仅会确保和跟踪当前IT生产能力和稳

在j2ee开发中影响性能的原因以及相关处理性的建议

java是现在比较流行的软件开发语言,同时也是互联网应用中安全性相对较高的一种开发语言了.被很多的电子金融系统开发企业以及电子商务网站建设企业所看重.虽然说在如今的互联网开发中,它比较有优势,然而用得不当的话,反而会使电子商务网站建设的性能受到影响.电子商务网站建设企业,就从多年的java商城开发中说说影响java商城系统和jsp商城效率的原因.    1.缺乏正确的容量规划    容量规划是一个全面的和发展的过程标准,预测当前和未来的IT环境容量需求.制定合理的容量规划不仅会确保和跟踪当前IT

微服务开发中的数据架构设计

本文来自作者 陈伟荣 在 GitChat 分享的文章[微服务开发中的数据架构设计] 前言 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性,可以实现业务之间的松耦合.业务的灵活调整组合以及系统的高可用性.为业务创新和业务持续提供了一个良好的基础平台.本文分享在这种技术架构下的数据架构的设计思想以及设计要点,本文包括下面若干内容. 微服务技术框架中的多层数据架构设计 数据架构设计中的要点 要点1:数据易用性 要点2:主.副数据及数据解耦 要点3:分库分表

Android实际开发中的首页框架搭建(二、首页框架实现)

本来这一篇是前两天就要写的,奈何事多缠身,推到今日,为自己的拖延感到愧疚... 上一篇大概把项目的结构完成了,下一步就是实现首页切换功能了 首先在activity目录下新建一个HomeActivity,作为承载多个fragment的容器 代码如下 1 /* 2 * * 3 * * ******************************************************* 4 * * 5 * * @文件名称:HomeActivity.java 6 * * @文件作者:ouyan

结构化方法和面向对象方法在软件开发中的对比

学习过C语言和JAVA的同学们一定清楚,这两种语言代表了两种不同的开发方式,即以C语言为代表的结构化开发方法和JAVA代表的面向对象的开发方法.由于二者在程序结构上有着很大的区别,因此,在软件开发领域中,根据自己的需求来选择合理的开发方式就显得尤为重要. 开发软件通常有三个层次: 1.满足用户需求 2.可维护性,即可修改性,让软件能随着用户需求的变更而容易改变 3.可重用性(在其它软件中,能尽量重用该软件的模块) 通过对软件的这三个主要层次的分析,我们就能在实际开发中确定我们的选择. 结构化方法

Java开发中的23种设计模式详解(转)

设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

HTML5移动开发中的meta与link

meta HTML5移动开发中的一些webkit专属头部标签,能够帮助浏览器更好的解析HTML代码,从而为HTML5移动开发提供更好的前端表现与体验 viewport网页缩放 1 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" /> UTF-8编码 1