zoukankan      html  css  js  c++  java
  • 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),并尽可能快地完成和释放事务。在事务执行期间,您还应该避免执行任何不必要的、与数据库无关的代码,这能够防止资源被毫无疑义地锁定过长的 时间。

  • 相关阅读:
    javascript 创建节点和新增节点
    javascript 操作节点的属性
    javascript window对象常用方法
    为什么要用线程池?
    一个request请求然后锁定等待异步接口处理结果
    双端队列实现串行处理实现并发
    线程池创建线程的方式一定效率高吗?
    PriorityBlockingQueue 和 Executors.newCachedThreadPool()
    核心记账业务可用jdk7的PriorityBlockingQueue优先阻塞队列结合乐观锁实现
    对spring、AOP、IOP的理解 (转)
  • 原文地址:https://www.cnblogs.com/fuyu-blog/p/4410320.html
Copyright © 2011-2022 走看看