在一个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:

/// <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:

/// <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:

该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 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命令就可以了
- C#中四种常用集合的运用(非常重要)
C#中4个常用的集合 1.ArrayList ArrayList类似于数组,有人也称它为数组列表.ArrayList可以动态维护,而数组的容量是固定的. 它的索引会根据程序的扩展而重新进行分配和调整. ...
- MySQL中四种常用存储引擎的介绍
MySQL常用的四种引擎的介绍 (1):MyISAM存储引擎: 不支持事务.也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 ...
- C#中四种常用集合的运用(非常重要)【转】
1.ArrayList ArrayList类似于数组,有人也称它为数组列表.ArrayList可以动态维护,而数组的容量是固定的. 它的索引会根据程序的扩展而重新进行分配和调整.和数组类似,它所存储的 ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- java正则表达式四种常用的处理方式是怎么样呢《匹配、分割、代替、获取》
java 正则表达式高级篇,介绍四种常用的处理方式:匹配.分割.替代.获取,具体内容如下package test; import java.util.regex.Matcher; import jav ...
- 【转】 FPGA设计的四种常用思想与技巧
本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作 ...
- 转--Android按钮单击事件的四种常用写法总结
这篇文章主要介绍了Android按钮单击事件的四种常用写法总结,比较了常见的四种写法的优劣,有不错的参考借鉴价值,需要的朋友可以参考下 很多学习Android程序设计的人都会发现每个人对代码的 ...
- Java中几种常用数据类型之间转换的方法
Java中几种常用的数据类型之间转换方法: 1. short-->int 转换 exp: short shortvar=0; int intvar=0; shortvar= (short) in ...
- javaservlet处理四种常用api请求get,put,post,delete
一般在网站搭建中servlet只需处理post,get请求便足已.本篇注重使用javaweb编写restful风格api,在servlet中对四种常用请求进行处理. 在api中对于一个请求要做的通常是 ...
随机推荐
- PAT (Advanced Level) 1095. Cars on Campus (30)
模拟题.仔细一些即可. #include<cstdio> #include<cstring> #include<cmath> #include<algorit ...
- PD生成oracle表名带引号解决方案
使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会 严格按照“”中的名称建表,如果没有“”,会按照ORAC ...
- chromium blog
http://blog.chromium.org/
- Android的Activity跳转动画各种效果整理
Android的Activity跳转就是很生硬的切换界面.其实Android的Activity跳转可以设置各种动画,本文整理了一些,还有很多动画效果,就要靠我们发挥自己的想象力 大家使用Android ...
- c++ 显示调用dll
首先需要引入:#include<windows.h> 否则会出现 HINSTANCE 未定义的错误
- 设置HTML表格细边框
简介:WEB前端|这是关于怎么设置HTML表格细边框的问题,把表格边框设置为细小的线条边框一般我们用表格的时候总会给它个border属性,比如:<tableborder="1" ...
- 滑雪(ski)
滑雪(ski) 题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- Matplotlib中文显示的问题
原文地址:http://blog.csdn.net/rumswell/article/details/6544377 #Matplotlib中文显示有问题,当然可以修改配置文件matplotlibrc ...
- 笔记整理--HTTP Header 详解
HTTP Header 详解 2013/09/21 | 分类: IT技术 | 0 条评论 | 标签: HTTP 分享到:36 原文出处: zcmhi HTTP(HyperTextTransferPro ...
- docker 镜像仓库 Harbor 部署 以及 跨数据复制
docker 镜像仓库 Harbor 部署 跨数据复制 Harbor 是 Vmwar 公司开源的 企业级的 Docker Registry 管理项目 它主要 提供 Dcoker Registry 管理 ...