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

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

.NET事务

  • ADO.NET事务
  1. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))
  2. {
  3. conn.Open();
  4. using (SqlTransaction tran = conn.BeginTransaction())
  5. {
  6. using (SqlCommand cmd = new SqlCommand())
  7. {
  8. cmd.Connection = conn;
  9. cmd.CommandType = CommandType.Text;
  10. cmd.Transaction = tran;
  11. try
  12. {
  13. cmd.CommandText = sql1;
  14. cmd.ExecuteNonQuery();
  15. cmd.CommandText = sql2;
  16. cmd.ExecuteNonQuery();
  17. tran.Commit();
  18. Response.Write("Ok");
  19. }
  20. catch (SqlException ex)
  21. {
  22. tran.Rollback();
  23. Response.Write("Error:" + ex.Message);
  24. }
  25. }
  26. }
  27. conn.Close();
  28. }
  29.  
  30. ADO.NET 显式事务占用资源少、速度快,但功能简单,只能管理单一对象和单一持久资源间的事务,比如想在数据库 B 插入失败,则回滚对数据库 A 的操作,就无法用这种 ADO.NET 显式事务来实现。
  • 隐式事务(TransactionScope)
  1. 隐式事务不具有CommitRoolback方法。
  2.  
  3. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))
  4. {
  5. using (TransactionScope ts = new TransactionScope())
  6. {
  7. conn.Open();
  8. using (SqlCommand cmd = new SqlCommand())
  9. {
  10. cmd.Connection = conn;
  11. cmd.CommandType = CommandType.Text;
  12. try
  13. {
  14. cmd.CommandText = "insert into TranTable(Priority) values(1)";
  15. cmd.ExecuteNonQuery();
  16. cmd.CommandText = "insert into TranTable(Priority) values(256)";
  17. cmd.ExecuteNonQuery();
  18. ts.Complete();
  19. Response.Write("Ok");
  20. }
  21. catch (SqlException ex)
  22. {
  23. Response.Write("Error:" + ex.Message);
  24. }
  25. }
  26. }
  27. conn.Close();
  28. }
  29.  
  30. TransactionScope没有和数据库直接关联,那是怎么实现用事务的方式执行语句的呢?
  31.  
  32. 如果我们在连接字符串里面加上Enlist=false;,再执行上面的代码,发现插入了一条1的记录,说明并不是以事务方式执行的。Enlist默认为trueSqlClient会自动检测是否存在事务,如果有事务,则自动登记到事务中。
  • 显示事务(CommittableTransaction)
  1. using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))
  2. {
  3. using (CommittableTransaction ct = new CommittableTransaction())
  4. {
  5. conn.Open();
  6. conn.EnlistTransaction(ct);//将连接登记到事务
  7. using (SqlCommand cmd = new SqlCommand())
  8. {
  9. cmd.Connection = conn;
  10. cmd.CommandType = CommandType.Text;
  11. try
  12. {
  13. cmd.CommandText = "insert into TranTable(Priority) values(1)";
  14. cmd.ExecuteNonQuery();
  15. cmd.CommandText = "insert into TranTable(Priority) values(256)";
  16. cmd.ExecuteNonQuery();
  17. ct.Commit();
  18. Response.Write("Ok");
  19. }
  20. catch (SqlException ex)
  21. {
  22. ct.Rollback();
  23. Response.Write("Error:" + ex.Message);
  24. }
  25. }
  26. }
  27. conn.Close();
  28. }
  • WebService(TransactionOption)
  1. 首先引用using System.EnterpriseServices;,然后设置属性TransactionOption = TransactionOption.Required
  2.  
  3. 设置TransactionOption.DisabledTransactionOption.NotSupportedTransactionOption.Supported表示不参与事务。
  4.  
  5. 设置TransactionOption.RequiredTransactionOption.RequiresNew表示创建一个新的事务。意思是说当TransactionOption的属性为Required RequiresNewWEB服务方法调用另一个TransactionOption的属性为RequiredRequiresNewWEB服务方法时,每个WEB服务方法将参与他们自己的事务,因为Web Service方法只能用作事务中的根对象。
  6.  
  7. PSWEB服务方法的TransactionOption默认属性为Disabled
  8.  
  9. 提交事务ContextUtil.SetComplete();
  10.  
  11. 回滚事务ContextUtil.SetAbort();
  12.  
  13. [WebMethod(TransactionOption = TransactionOption.Required)]
  14. public string HelloWorld()
  15. {
  16. try
  17. {
  18. ContextUtil.EnableCommit();//开启事务
  19. SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=sa;database=db.mdf;");
  20. SqlCommand cmd = new SqlCommand("update users set name = 'yangxing' where id = 5", con);
  21. con.Open();
  22. cmd.ExecuteNonQuery();
  23. cmd.CommandText = "update users1 set name = 'yangxing1' where id = 6";//users1表不存在,执行该语句报错
  24. cmd.ExecuteNonQuery();//抛出异常
  25. ContextUtil.SetComplete();//提交事务
  26. return "true";
  27. }
  28. catch
  29. {
  30. ContextUtil.SetAbort();//回滚事务
  31. return "false";
  32. }
  33. }
  • 自动事务处理

  1. 在方法之前增加属性[AutoComplete(true)],这样如果方法执行时没有异常就默认提交,如果有异常则这个方法就会回滚。
  2.  
  3. using System;
  4. using System.Data.SqlClient;
  5. using System.EnterpriseServices;//企业级服务COM+事务
  6. namespace ClassTran
  7. {
  8. [Transaction(TransactionOption.Required)]
  9. public class OrderData2 : ServicedComponent
  10. {
  11. //自动事务
  12. [AutoComplete(true)]
  13. public string WorkTran()
  14. {
  15. string msg = "";
  16. string conString = "data source=127.0.0.1;database=codematic;
  17. user id=sa;password=";
  18. SqlConnection myConnection = new SqlConnection(conString);
  19. myConnection.Open();
  20. SqlCommand myCommand = new SqlCommand();
  21. myCommand.Connection = myConnection;
  22. try
  23. {
  24. myCommand.CommandText = "update P_Product set Name='电脑2'
  25. where Id=";
  26. myCommand.ExecuteNonQuery();
  27. myCommand.CommandText = "update P_Product set Name='电脑3'
  28. where Id=";
  29. myCommand.ExecuteNonQuery();
  30. msg ="成功!";
  31. }
  32. catch (Exception ex)
  33. {
  34. msg = "失败:"+ex.Message;
  35. }
  36. finally
  37. {
  38. myConnection.Close();
  39. }
  40. return msg;
  41. }
  42. }
  43. }

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

  1. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  2. NET软件开发中的事务大全

      各种事务很全啊. 原文地址:http://www.cnblogs.com/ltp/archive/2009/06/17/1505304.html     1 .NET开发中的事务处理大比拼 之 S ...

  3. 【WebApi系列】浅谈HTTP在WebApi开发中的运用

    WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...

  4. Java Web应用开发中的一些概念

    最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...

  5. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

  6. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  7. React在开发中的常用结构以及功能详解

    一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...

  8. Android学习探索之Java 8 在Android 开发中的应用

    前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...

  9. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

随机推荐

  1. 两个异步处理AsyncTask和Handler的优缺点

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  2. 前端程序员:月薪 5K 到 5 万,我干了啥(转)

    转自:http://www.imooc.com/article/4110 前端程序员:月薪 5K 到 5 万,我干了啥前端开发工作已经变的越来越复杂,仅仅是想罗列一份前端开发的学习列表就已经是一件艰巨 ...

  3. RPC调用框架比较分析

    什么是RPC: RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC ...

  4. Windows执行打开文件命令

    ShellExecute(NULL, "open",  localFile.c_str(),  NULL, NULL, SW_SHOW);          会调用该文件类型关联的 ...

  5. python代码编程规范

    一.内容格式 1.注释部分:模块名及简介(一般用一行写完),模块描述(包含各类方法),其它描述(注意点,功能,示例等,可以分多段) 2.导入模块:Import XXX 3.全局变量定义:wantobj ...

  6. os和os.path模块

    Os和os.path模块函数 1.      Os模块 函数 描述 文件处理 Mkfifo()/mknod() 创建命名管道/创建文件系统节点 Remove()/unlink() 删除文件 Renam ...

  7. qt信号signal和槽slot机制

    内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...

  8. macos+apache+php+phpmyadmin 的整合过程梳理

    启动Apache 有两种方法: 打开“系统设置偏好(System Preferences)” -> “共享(Sharing)” -> “Web共享(Web Sharing)”. 打开“终端 ...

  9. 【转】Android Intent Action 大全

    String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. “android.intent.action.ADD_SHORTCUT” String ALL_APPS_AC ...

  10. 【Python学习笔记】with语句与上下文管理器

    with语句 上下文管理器 contextlib模块 参考引用 with语句 with语句时在Python2.6中出现的新语句.在Python2.6以前,要正确的处理涉及到异常的资源管理时,需要使用t ...