TransactionScope 事务使用说明

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

下列代码就是一个正在创建的事务,这个事务自身还封装了多个数据库查询。只要任意一个 SqlCommand 对象引发异常,程序流控制就会跳出 TransactionScope 的 using 语句块,随后,TransactionScope 将自行释放并回滚该事务。由于这段代码使用了 using 语句,所以 SqlConnection 对象和 TransactionScope 对象都将被自动调用Dispose()释放。由此可见,只需添加很少的几行代码,您就可以构建出一个事务模型,这个模型可以对异常进行处理,执行结束后会 自行清理,此外,它还可以对命令的提交或回滚进行管理。

TransactionOptions transactionOption = new TransactionOptions();

            //设置事务隔离级别
            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;

            // 设置事务超时时间为60秒
            transactionOption.Timeout = new TimeSpan(0, 0, 60);

            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                try
                {
                    //在这里实现事务性工作
     //发送消息
                    insertMessage(sendUserId, toUser, content, sendedStatus);

     //在接收信息表中插入记录
                    receiveCount += insertReceiveMessage(userids[0], sendUserId, content, "0");

                    // 没有错误,提交事务
                    scope.Complete();
                }
                catch (Exception ex) {
                    throw new Exception("发送信息异常,原因:"+ex.Message);
                }finally{
                    //释放资源
                    scope.Dispose();
                  }
            }

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

所有的事务级别如下:

成员名称 说明 
 Chaos                         无法改写隔离级别更高的事务中的挂起的更改。  
 ReadCommitted       不可以在事务期间读取可变数据,但是可以修改它。  
 ReadUncommitted    可以在事务期间读取和修改可变数据。  
 RepeatableRead       可以在事务期间读取可变数据,但是不可以修改。可以在事务期间添加新数据。  
 Serializable                可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据。  
 Snapshot                   可以读取可变数据。在事务修改数据之前,它验证在它最初读取数据之后另一个事务是否更改过这些数据。如果数据已被更新,则会引发错误。这样使事务可获取先前提交的数据值。 
在尝试提升以此隔离级别创建的事务时,将引发一个 InvalidOperationException,并产生错误信息“Transactions with IsolationLevel Snapshot cannot be promoted”(无法提升具有 IsolationLevel 快照的事务)。
 
 Unspecified                正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。如果设置了此值,则会引发异常。

总结:
       进入和退出事务都要快,这一点非常重要,因为事务会锁定宝贵的资源。最佳实践要求我们在需要使用事务之前再去创建它,在需要对其执行命令前迅速打开连接, 执行动作查询 (Action Query),并尽可能快地完成和释放事务。在事务执行期间,您还应该避免执行任何不必要的、与数据库无关的代码,这能够防止资源被毫无疑义地锁定过长的 时间。

时间: 2024-11-08 02:43:04

TransactionScope 事务使用说明的相关文章

TransactionScope事务

一个错误的理解就是Complete()方法是提交事务的,这是错误的,事实上,它的作用的表示本事务完成,它一般放在try{}的结尾处,不用判断前台操作是否成功,如果不成功,它会自己回滚. #region 事务问题            using (TransactionScope trans = new TransactionScope())            {                try                {                    InsertUse

c#使用 TransactionScope事务导入数据例程

using System.Transactions; try { using (TransactionScope scope = new TransactionScope()) { var count = dc.ExecuteCommand(@"insert into bg_count_month(tj_month,emp_id,emp_name,count_month,count_day,money,dw) select tj_month,emp_id,emp_name,count_month

TransactionScope事务操作

using (TransactionScope trans = new TransactionScope()) { try { InsertUserBase(); //它插入不成功,自己回滚 UserInfos userInfo = new UserInfos { UserID = "1", RealName = "zzl", }; db.UserInfos.InsertOnSubmit(userInfo); db.SubmitChanges(); trans.Co

C#中的事务TransactionScope

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

关于TransactionScope 使用

在去年的项目中使用了TransactionScope,现在总结下TransactionScope的使用说明 一.TransactionScope是.Net Framework 2.0之后,新增了一个名称空间.它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物.使用之前必须添加对 System.Transactions.dll 的引用. 二.代码实例 //设置事务隔离级别transactionOption.IsolationLevel = System.Tra

EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~续~添加事务机制

回到目录 上一讲中简单介绍了一个EF环境下通过DbCommand拦截器来实现SQLSERVER的读写分离,只是一个最简单的实现,而如果出现事务情况,还是会有一些问题的,因为在拦截器中我们手动开启了Connection链接,而在一个WEB请求时,如果你的一个变量即用到了read库又用到了write库,就会导致到sqlserver端的spid(system process id,系统进程ID,sqlserver里可能是某个数据库进程序的ID)发生变化 ,而对于这种变化,原本是本地的事务就会自动提升为

.Net 事务

在分布式应用程序中,不可避免地会经常使用到事务控制.事务有一个开头和一个结尾,它们指定了事务的边界,事务在其边界之内可以跨越进程和计算机.事务边界内的所有资源都参与同一个事务.要维护事务边界内资源间的一致性,事务必须具备 ACID 属性,即原子性.一致性.隔离性和持续性. 1.本地事务和分布式事务 本地事务是其范围为单个可识别事务的数据资源的事务(例如,Microsoft SQL Server 数据库或 MSMQ 消息队列).例如,当单个数据库系统拥有事务中涉及的所有数据时,就可以遵循 ACID

DataBase 之 存储过程、函数、触发器、事务、游标

(1)存储过程 [1]创建存储过程(无参) create procedure ProTestAas  select * from TestA --修改存储过程(有参,且为输出参数)alter procedure ProTestA@LastName varchar(10) = null outputas  if @LastName is null  begin     print 'null'     print '123'  end  else  begin  print @LastName 

TransactionScope的使用

本文导读:在实际开发工作中,执行一个事件,然后调用另一接口插入数据,如果处理逻辑出现异常,那么之前插入的数据将成为垃圾数据,我们所希望的是能够在整个这个方法定义为一个事务,TransactionScope 类提供一个简单方法,通过这一方法,您不必与事务本身交互,即可将代码块标记为参与某个事务.TransactionScope对象创建了一个事务,同时将该事务设置给Transaction类的Current属性. 一.TransactionScope的优点 1.使用起来比较方便.Transaction