关于TransactionScope 使用

在去年的项目中使用了TransactionScope,现在总结下TransactionScope的使用说明

一、TransactionScope是.Net Framework 2.0之后,新增了一个名称空间。它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物。使用之前必须添加对 System.Transactions.dll 的引用。

二、代码实例

//设置事务隔离级别
transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
// 设置事务超时时间为60秒
transactionOption.Timeout = new TimeSpan(0, 0, 60);

using (TransactionScope tran = new TransactionScope())
{

  try
                { tran.Complete(); }
                catch
                {}

}

三、在TransactionScope中默认的事务级别是Serializable,即在事务过程中,完全性锁表。别的进程不能查询,修改,新增,删除。这样会导致效率大大降低,虽然数据完整性很高。通常我们不需要那么

所有的事务级别如下:

成员名称 说明 

Chaos                      无法改写隔离级别更高的事务中的挂起的更改。  

ReadCommitted        不可以在事务期间读取可变数据,但是可以修改它。  

ReadUncommitted     可以在事务期间读取和修改可变数据。  

RepeatableRead        可以在事务期间读取可变数据,但是不可以修改。可以在事务期间添加新数据。  

Serializable               可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据。  

Snapshot                  可以读取可变数据。在事务修改数据之前,它验证在它最初读取数据之后另一个事务是否更改过这些数据。如果数据已被更新,则会引发错误。这样使事务可获取先前提交的数据值。

四、在C#中使用TransactionScope类(分布式事务),则须注意如下事项

1、在项目中引用using System.Transactions命名空间(先要在添加net组件的引用);

2、对MSDTC组件设置:

在控制面板--->管理工具--->服务 中,开启Distributed Transaction Coordinator 服务。

a、控制面板->管理工具->组件服务->计算机->我的电脑->右键->属性

b、选择MSDTC页, 确认"使用本地协调器"

c、点击下方"安全配置"按钮

d、勾选: "允许网络DTC访问","允许远程客户端","允许入站","允许出站","不要求进行身份验证".

e、对于数据库服务器端, 可选择"要求对呼叫方验证"

f、勾选:"启用事务Internet协议(TIP)事务"。

g、在双方防火墙中增加MSDTC.exe例外 可用命令行: netsh firewall set allowedprogram %windir%/system32/msdtc.exe MSDTC enable

3、重启IIS服务器。

五、使用分布式事务注意如下几点

1:确保参与事务的machine开启了分布式事务支持;

2:如果machine开启了防火墙,需要设置msdtc进程为例外;

3:参与事务的machine不能跨域(如果跨域,目前微软还没有确切的解决方案);

时间: 2024-11-05 16:06:21

关于TransactionScope 使用的相关文章

TransactionScope类的使用

如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项:1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具体示例如下:   /// <summary>        /// 发送消息         /// </summary>        /// <param name="sendUserId"></param>        /// <

ADO.NET中的TransactionScope何时需要启用MSTDC(分布式事务管理)

我们知道在ADO.NET中可以用TransactionScope来将多个SqlConnection(多个数据库连接)执行的Sql语句放入一个事物中提交或取消,但是使用TransactionScope的时候也要额外小心,因为当TransactionScope在特殊情况下需要启动MSTDC(分布式事务管理),那么我们来看看什么时候TransactionScope需要启动MSTDC呢? 首先来声明下本例中代码和数据库的环境,首先本例中C#代码运行的电脑和SqlServer数据库所在的电脑是局域网中的两

TransactionScope 类

1.使代码块成为事务性代码,此类不能被继承. 2.继承层次结构 System.Object System.Transactions.TransactionScope 3.备注 在System.Transactions多事务自动管理的基础平台上,System.Transactions 提供了基于Transaction类显式编程模型, 以及使用TransactionScope类隐式编程模型. 重要事项 建议创建隐式事务使用TransactionScope类,使系统自动为您管理事务.当有需要跨多个函数

基于TransactionScope类的分布式隐式事务

System.Transactions 命名空间中除了上一节中提到的基于 Transaction 类的显式编程模型,还提供使用 TransactionScope 类的隐式编程模型,它与显示编程模型相比,更加方便简单,它也是MSDN中建议使用的编程模型. 下面,我们基于TransactionScope类实现上一节银行转帐的例程. 示例代码: (1)SqlHelper.cs using System; using System.Collections.Generic; using System.Li

使用TransactionScope做分布式事务协调

//场景是使用在多个数据库之间的协调,.NET 2.0使用一个新的类型 TransactionScope来进行协调,这与之前的COM+协调是相对来说更加方便的 //需要引用一个新的程序集:System.Transactions//需要特别注意一个地方,TransactionScope默认使用的事务隔离级别为串行化,那可能会太过于严格.所以应该根据需要进行必要的调整 //注意:还是需要MSDTC服务支持的.请用net start msdtc启用它 TransactionOptions option

探索逻辑事务 TransactionScope

一.什么是TransactionScope? TransactionScope即范围事务(类似数据库中的事务),保证事务声明范围内的一切数据修改操作状态一致性,要么全部成功,要么全部失败回滚. MSDN:如果在事务范围内未不发生任何异常 (即之间的初始化 TransactionScope 对象并调用其 Dispose 方法),则范围所参与的事务可以继续,否则参与到其中的事务将回滚. 当应用程序完成所有工作时它想要在事务中执行,应调用 Complete 方法一次,以通知该事务管理器是可接受(此时事

C#中TransactionScope的使用方法和原理

在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务的处理,都交给了SqlTransaction和SqlConnection,每个Transaction是基于每个Connection的.这种设计对于跨越多个程序集或者多个方法的事务行为来说,不是非常好,需要把事务和数据库连接作为参数传入. 在.net 2.0后,TransactionScope类的出现,大大的简化了事务的设计.示例代码如下: static void Main(string[] args) { usi

EntityFrameWork使用TransactionScope分布式事务,存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 错误

最近在开发一个小型的物业管理系统,系统其中有一个功能需要每个月按抄的水表.电表等生成相应的费用,数据库主要的基础数据表有大楼水.电表.楼层水.电表.房间水电表:其中大楼和楼层的水电表是用于计算公摊的:系统设计有一个费用的统计表,表名ChargeAccountMaster,表内设计的有一个字段ID,主键 . 自增长:计算时由于是数据核算统计,所以引入事务计算数据的同时,也会把相应计算的结果回写回基础数据表中,计算的类是service层,框架的ORM用的是EF,就没有采用本地事务,采用了分布式事务T

事物TransactionScope

如果修改.删除.添加一类操作涉及到多张表,那么最好用事物 trans.Complete();保证多张表的同时修改 using (TransactionScope trans = new TransactionScope()) { if (result.Result) { foreach (SubOrders subOrders in listSubOrders) { if (result.Result) { result.Result = _orderDao.UpdateSubOrders(su

TransactionScope小例

1 public static class DataTableHelper { public static List<T> ToModel<T>(this DataTable dt) where T : class ,new() { if (dt == null || dt.Rows.Count == 0) return null; Type type = typeof(T); var list = new List<T>(); for (int row = 0; ro