.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=";
- myCommand.ExecuteNonQuery();
- myCommand.CommandText = "update P_Product set Name='电脑3'
- where Id=";
- myCommand.ExecuteNonQuery();
- msg ="成功!";
- }
- catch (Exception ex)
- {
- msg = "失败:"+ex.Message;
- }
- finally
- {
- myConnection.Close();
- }
- return msg;
- }
- }
- }
.NET开发中的事务处理大比拼的更多相关文章
- 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,这种形 ...
- NET软件开发中的事务大全
各种事务很全啊. 原文地址:http://www.cnblogs.com/ltp/archive/2009/06/17/1505304.html 1 .NET开发中的事务处理大比拼 之 S ...
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- Java Web应用开发中的一些概念
最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台: 微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...
- TDD在Unity3D游戏项目开发中的实践
0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...
- React在开发中的常用结构以及功能详解
一.React什么算法,什么虚拟DOM,什么核心内容网上一大堆,请自行google. 但是能把算法说清楚,虚拟DOM说清楚的聊聊无几.对开发又没卵用,还不如来点干货看看咋用. 二.结构如下: impo ...
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
随机推荐
- 两个异步处理AsyncTask和Handler的优缺点
AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...
- 前端程序员:月薪 5K 到 5 万,我干了啥(转)
转自:http://www.imooc.com/article/4110 前端程序员:月薪 5K 到 5 万,我干了啥前端开发工作已经变的越来越复杂,仅仅是想罗列一份前端开发的学习列表就已经是一件艰巨 ...
- RPC调用框架比较分析
什么是RPC: RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC ...
- Windows执行打开文件命令
ShellExecute(NULL, "open", localFile.c_str(), NULL, NULL, SW_SHOW); 会调用该文件类型关联的 ...
- python代码编程规范
一.内容格式 1.注释部分:模块名及简介(一般用一行写完),模块描述(包含各类方法),其它描述(注意点,功能,示例等,可以分多段) 2.导入模块:Import XXX 3.全局变量定义:wantobj ...
- os和os.path模块
Os和os.path模块函数 1. Os模块 函数 描述 文件处理 Mkfifo()/mknod() 创建命名管道/创建文件系统节点 Remove()/unlink() 删除文件 Renam ...
- qt信号signal和槽slot机制
内容: 一.概述 二.信号 三.槽 四.信号与槽的关联 五.元对象工具 六.程序样例 七.应注意的问题 信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工 ...
- macos+apache+php+phpmyadmin 的整合过程梳理
启动Apache 有两种方法: 打开“系统设置偏好(System Preferences)” -> “共享(Sharing)” -> “Web共享(Web Sharing)”. 打开“终端 ...
- 【转】Android Intent Action 大全
String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式.. “android.intent.action.ADD_SHORTCUT” String ALL_APPS_AC ...
- 【Python学习笔记】with语句与上下文管理器
with语句 上下文管理器 contextlib模块 参考引用 with语句 with语句时在Python2.6中出现的新语句.在Python2.6以前,要正确的处理涉及到异常的资源管理时,需要使用t ...