博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TransactionScope 事务使用说明
阅读量:7131 次
发布时间:2019-06-28

本文共 2310 字,大约阅读时间需要 7 分钟。

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

 

转载于:https://www.cnblogs.com/fuyu-blog/p/4410320.html

你可能感兴趣的文章
java语言基础
查看>>
通过weblogic自带脚本正常关闭受管理服务器方法
查看>>
关于最近很火的安卓stagefright漏洞
查看>>
iOS开发那些事-iOS网络编程同步GET方法请求编程
查看>>
pycharm,vim,items2常用快捷键
查看>>
Flask blueprint蓝图按功能模块化架构实例
查看>>
数据支撑环境的改造
查看>>
ifconfig 命令用来查看和配置网络设备
查看>>
用 netstat 查看 TCP 网络状态详解
查看>>
JVM 调优总结:一些概念
查看>>
HTML5:使用Lawnchair库存储JSON
查看>>
如何设计秒杀系统
查看>>
屏蔽USB设备的几种方法
查看>>
zen cart 特价商品列表页中加入排序选择
查看>>
配置Pycharm4.5.4调试edX Devstack
查看>>
Nginx+Tomcat负载均衡配置
查看>>
symbol AP5131重置密码和恢复出厂设置
查看>>
自定义一个jdbc框架
查看>>
[SHELL]shell scripts笔记(2)
查看>>
redis 客户端工具
查看>>