微软的TransactionScope类是个好玩意
最近发现微软自带的TransactionScope(.Net Framework 2之后)是个好东东,提供的功能也很强大。
首先说说TransactionScope是什么,并能为我们做什么事情。其实看Transaction(事务)这个单词,我想大家已经能猜到个大概。不同于SqlTransaction的事务,因为现在做的项目都有不同的分层架构,如果不在数据库操作层里面做的话,那么使用TransactionScope是一种理想的方式,它是一个轻量级的事务类。所谓事务,就好比两个串联的开关,控制着一个灯泡,这两个开关可以理解为一个独立的单位,要么都开,否则灯泡就亮不起来。在程序里面就是要么都正常执行,如果中间有异常,事务就会出现回滚操作。回滚操作相当于回到操作之前的状态,可以理解为没有操作。这里面,事务是针对数据库的一种行为。
要想使用TransactionScope,很方便,只需要在项目中添加System.Transactions.dll引用,然后添加命名空间(using System.Transactions;)即可。
我们来看看微软的TransactionScope类:
public sealed class TransactionScope : IDisposable
{
public TransactionScope();
public TransactionScope(Transaction transactionToUse);
public TransactionScope(TransactionScopeOption scopeOption);
public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout);
public TransactionScope(TransactionScopeOption scopeOption, TimeSpan scopeTimeout);
public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions);
public TransactionScope(Transaction transactionToUse, TimeSpan scopeTimeout, EnterpriseServicesInteropOption interopOption);
public TransactionScope(TransactionScopeOption scopeOption, TransactionOptions transactionOptions, EnterpriseServicesInteropOption interopOption); public void Complete();
public void Dispose();
}
sealed关键字修饰类,说明该类不能被继承。该类提供多种构造函数及Complete()和Dispose()方法.
=》Complete()即为提交事件的方法
=》Dispose()即释放事务对象的方法
(1)TransactionScopeOption参数,该参数是一个枚举类型:
public enum TransactionScopeOption
{ Required = ,
RequiresNew = ,
Suppress =
}
Required=》该范围需要一个事务。 如果已经存在事务,则使用该事务。
否则,在进入范围之前创建新的事务。 这是默认值。
RequiresNew=》总是为该范围创建新事务
Suppress=》事务上下文在创建范围时被取消。 范围中的所有操作都在无事务上下文的情况下完成。
通过查看 System.Transactions.Transaction.Current 属性。如果这个属性为“null”,说明不存在当前事务。
(2)TransactionOptions参数,包含指定事务行为的附加信息。
public struct TransactionOptions
{ 。。。。。。 public IsolationLevel IsolationLevel { get; set; }
public TimeSpan Timeout { get; set; }
}
如果要修改 TransactionScope 的默认设置,可以实例化TransactionOptions对象,并对该对象传递需要的参数。可以通过它在 TransactionScope 对象上设置隔离级别和事务的超时时间。
IsolationLevel=》设置隔离级别
Serializable 可以在事务期间读取可变数据,但是不可以修改,也不可以添加任何新数据。
RepeatableRead 可以在事务期间读取可变数据,但是不可以修改。 可以在事务期间添加新数据。
ReadCommitted 不可以在事务期间读取可变数据,但是可以修改它。
ReadUncommitted 可以在事务期间读取和修改可变数据。
Snapshot 可以读取可变数据。在事务修改数据之前,它验证在它最初读取数据之后另一个事务是否更改过这些数据。如果数据已被更新,则会引发错误。这样使事务可获取先前提交的数据值。在尝试提升以此隔离级别创建的事务时,将引发一个InvalidOperationException,并产生错误信息“Transactions with IsolationLevel Snapshot cannot be promoted”(无法提升具有 IsolationLevel 快照的事务)。
Chaos 无法覆盖隔离级别更高的事务中的挂起的更改。
Unspecified 正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。如果设置了此值,则会引发异常。
Timeout=》设置事务的超时时间(默认设置为 1 分钟)
TimeSpan(Int64) 将新的 TimeSpan 初始化为指定的刻度数。
TimeSpan(Int32, Int32, Int32) 将新的 TimeSpan 初始化为指定的小时数、分钟数和秒数。
TimeSpan(Int32, Int32, Int32, Int32) 将新的 TimeSpan 初始化为指定的天数、小时数、分钟数和秒数。
TimeSpan(Int32, Int32, Int32, Int32, Int32) 将新的 TimeSpan 初始化为指定的天数、小时数、分钟数、秒数和毫秒数。
(3)下面举一个例子说明怎么使用,主要看红色部分的代码,红色部分代码即为使用TransactionScope的例子。用很少的几行代码就可以实现轻量级TransactionScope事务。
public void FixProjectSorceInsert()
{
TransactionOptions transactionOption = new TransactionOptions();
//设置事务隔离级别
transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
// 设置事务超时时间为120秒
transactionOption.Timeout = new TimeSpan(, , ); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
{
try
{
Insert(); Update(); Delete(); // 没有错误,提交事务
scope.Complete();
}
catch (Exception ex)
{
throw new Exception("发送信息异常,原因:" + ex.Message);
}
finally
{
//释放资源
scope.Dispose();
} }
}
(4)小结:使用事务,就像使用一把锁,会锁定资源。资源总是有限,所以进入和退出事务都要控制在较短的时间。在需要使用事务前创建它,在需要执行时打开连接,并尽快完成释放事务。而且在事务执行中,尽可能避免执行不必要或与数据库操作无关的代码,因为这能够防止资源被过度锁定。
微软的TransactionScope类是个好玩意的更多相关文章
- TransactionScope类的使用
如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项:1.在项目中引用using System.Transactions命名空间(先要在添加net组件的引用); 2.具体 ...
- 微软SQLHelper.cs类 中文版
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Co ...
- 微软SQLHelper.cs类
using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...
- 基于TransactionScope类的分布式隐式事务
System.Transactions 命名空间中除了上一节中提到的基于 Transaction 类的显式编程模型,还提供使用 TransactionScope 类的隐式编程模型,它与显示编程模型相比 ...
- 微软官方SqlHelper类 数据库辅助操作类
数据库操作类真的没有必要自己去写,因为成熟的类库真的非常完善了,拿来直接用就好,省时省力. 本文就为大家介绍微软官方的程序PetShop4.0中的SqlHelper类,先来做一下简单的介绍,PetSh ...
- TransactionScope类
命名空间:System.Transactons MSDN解释:使代码块成为事务性代码,此类不能被继承. 百度空间:在项目中引用using System.Transaction命名空间.在using 中 ...
- C# 实现 微软WebRequestMethods.Ftp类中的FTP操作功能
先奉献一个测试地址,ftp内的文件请勿删除,谢谢 FtpEntity fe = "); 由于代码量较多,只抽出一部分,详细代码请移步 ftp://wjshan0808.3vhost.net ...
- 微软的SQLHelper类(含完整中文注释)
using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...
- 微软原版SQLHelper类
代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...
随机推荐
- oracle所有的乱码解决方案
oracle所有的乱码解决方案 是不是经常看见各式各样的乱码,看见头就大了,大家别怕,所有的问题都会有一个甚至不止一个的解决方案,有句名言说的好:万法不离其踪.网上大部分把工具的乱码和代码操作的乱码混 ...
- ParserError: Error tokenizing data. C error: Expected 2 fields in line 15, saw 4
pandas 读取泰坦尼克号数据,报错 %matplotlib inline import numpy as np import pandas as pd import re as re train ...
- JS延时器 定时器 暂停器 中断器
// numberMillis 毫秒 function sleep(numberMillis) { var now = new Date(); var exitTime = now.getTime() ...
- 代理服务器和NAT技术
一.代理服务器 所谓“代理”,就是代而劳之的意思.代理服务器就是代理网络用户去取得网络信息,形象的说:它是网络信息的中转站,使得一个网络终端和另一个网络终端不直接进行相连,代理网络用户去取得信息.主要 ...
- redis删除指定前缀的缓存
redis作为缓存服务器为MySQL数据库提供较高的防御性,对于一些数据的查询可以直接从缓存中可以进行查询. 但是,某些情况下,我们需要清除缓存. 以下场景: 公司经常做活动,每个活动都存在大量的数据 ...
- type=file 自定义文件默认可选类型
<input type="file" accept=".csv, application/vnd.openxmlformats-officedocument.spr ...
- WPF捕获全局未处理异常
在WPF开发过程中我们一般都用try/catch块来捕获异常,但不是每个异常我们都能捕获,程序总会出现一些意想不到情况,抛出一些未捕获的异常,这时就要用到全局异常捕获,即在程序的最外层加上捕获未处理异 ...
- 2019 HEOI游记(真-退役记)
\(\color{#00ffff}{DAY \ \ -1}\) 下午又在说无聊的注意事项,有点紧张,不想做题,只想水题233333 晚上就水了几道网络流,晚四透彻依旧,yhzr二连胜,心里倒是放松了不 ...
- appium+android各配置参数获取'platformName'、'platformVersion'、appActivity、deviceName、webdriver.Remote
图中1的获取--'platformName'.'platformVersion' 点击appium右上角的运行按钮,可通过上面查看platformName 和 platformVersion 平台版本 ...
- rm: cannot remove `xxx’: Operation not permitted问题的处理方案
第一步:22.txt lsattr 22.txt 查看文件属性 看到的情况 -----a------- 第二步:去除a的属性 chattr -a 22.txt 第三步:在此执行删除 rm 22.txt