zoukankan      html  css  js  c++  java
  • TransactionScope

    转自:http://blog.csdn.net/wyxhd2008/article/details/7958423

    一、概念

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

    TransactionScope有三种模式:

    TransactionScopeOptions

    描述

    Required

    如果已经存在一个事务,那么这个事务范围将加入已有的事务。否则,它将创建自己的事务。

    RequiresNew

    这个事务范围将创建自己的事务。

    Suppress

    如果处于当前活动事务范围内,那么这个事务范围既不会加入氛围事务 (ambient transaction),也不会创建自己的事务。当部分代码需要留在事务外部时,可以使用该选项。

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

     

    2、代码例子:

     TransactionOptions transactionOption = new TransactionOptions();

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

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

                
    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();
                      }
                                   
                }

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

          所有的事务级别如下:

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

    二、与数据库事务结合

    //创建TransactionScope
    wps_clip_image-8386using (TransactionScope tsCope= new TransactionScope())
    wps_clip_image-10230wps_clip_image-16703{
    wps_clip_image-12198 using (SqlConnection cn2005= new SqlConnection(someSql2005))
    wps_clip_image-8414wps_clip_image-5728 {
    wps_clip_image-7947 SqlCommand cmd= new SqlCommand(sqlUpdate, cn2005);
    wps_clip_image-15199 cn2005.Open();
    wps_clip_image-11670 cmd.ExecuteNonQuery();
    wps_clip_image-716 }
    wps_clip_image-15176 using (SqlConnection cn2005= new SqlConnection(anotherSql2005))
    wps_clip_image-30312wps_clip_image-12410 {
    wps_clip_image-13405 SqlCommand cmd= new SqlCommand(sqlDelete, cn2005);
    wps_clip_image-29978 cn2005.Open();
    wps_clip_image-26021 cmd.ExecuteNonQuery();
    wps_clip_image-29682 }
    wps_clip_image-175
    wps_clip_image-27966 tsCope.Complete();
    wps_clip_image-554}

    三、与WCF事务结合

  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    block的是发送信号的线程,又不是处理槽函数的线程
  • 原文地址:https://www.cnblogs.com/yeagen/p/3021468.html
Copyright © 2011-2022 走看看