System.Transactions 基础结构既提供了基于 Transaction 类的显式编程模型,也提供了使用 TransactionScope 类的隐式编程模型,在后一种模型中,事务由该基础结构自动管理。编程
重要说明: |
建议使用 TransactionScope 类建立隐式事务,以便自动为您管理环境事务上下文。对于须要跨多个函数调用或多个线程调用使用相同事务的应用程序,您还应该使用 TransactionScope 和 DependentTransaction 类。有关此模型的更多信息,请参见使用事务范围实现隐式事务 主题。有关编写事务性应用程序的更多信息,请参见编写事务应用程序。并发 |
在经过 new 语句实例化 TransactionScope 时,事务管理器将肯定要参与哪一个事务。一经肯定,此范围将始终参与该事务。此决策基于两个因素:是否存在环境事务以及构造函数中 TransactionScopeOption 参数的值。 环境事务是在其中执行您的代码的事务。经过调用 Transaction 类的 Current 静态属性可获取对环境事务的引用。有关如何使用此参数的更多信息,请参见 使用事务范围实现隐式事务 主题的“事务流管理”一节。分布式
若是在事务范围中(即从初始化 TransactionScope 对象到调用其 Dispose 方法之间)未发生异常,则容许该范围所参与的事务继续。若是事务范围中的确发生了异常,它所参与的事务将回滚。函数
当应用程序完成它要在一个事务中执行的全部工做之后,您应当只调用 Complete 方法一次,以通知事务管理器能够接受提交事务。未能调用此方法将停止该事务。性能
对 Dispose 方法的调用标志着该事务范围的结束。在调用此方法以后发生的异常不会影响该事务。spa
若是在范围中修改 Current 的值,则会在调用 Dispose 时引起异常。可是,在该范围结束时,先前的值将被还原。此外,若是在建立事务的事务范围内对 Current 调用 Dispose,则该事务将在相应范围末尾处停止。.net
注意事项:线程
TransactionScope 使用注意事项
在
TransactionScope中,若是不是必需要避免它启用DTC分布式事务,由于性能低下;
而对于
TransactionScope来讲它是以链接对象Connection作为识别单位的,
也就是说即使是相同链接字符串ConnectionString的两个链接对象Connection在
TransactionScope也是会启用DTC分布式事务的,
避免的方法就是在一个
TransactionScope中使用一个惟一的链接对象Connection。
?
在
TransactionScope中默认的事务级别是Serializable,即在事务过程当中,彻底性锁表。
别的进程不能查询,修改,新增,删除。这样会致使效率大大下降,虽然数据完整性很高。
一般咱们不须要那么高的数据完整性。因此须要修改默认的事务级别:
?
事务级别:
成员名称????????????????? 说明?
Chaos??????????????????? 没法改写隔离级别更高的事务中的挂起的更改。??
ReadCommitted??????? 不能够在事务期间读取可变数据,可是能够修改它。??
ReadUncommitted???? 能够在事务期间读取和修改可变数据。??
RepeatableRead???????能够在事务期间读取可变数据,可是不能够修改。能够在事务期间添加新数据。??
Serializable??????????????能够在事务期间读取可变数据,可是不能够修改,也不能够添加任何新数据。??
Snapshot????????????????能够读取可变数据。在事务修改数据以前,它验证在它最初读取数据以后另外一个事务是否更改过这些数据。
??????????????????????????? 若是数据已被更新,则会引起错误。这样使事务可获取先前提交的数据值。
?
在尝试提高以此隔离级别建立的事务时,将引起一个?InvalidOperationException,并产生错误信息
"Transactions?with?IsolationLevel?Snapshot?cannot?be?promoted"(没法提高具备?IsolationLevel?快照的事务)
?
Unspecified??????????????正在使用与指定隔离级别不一样的隔离级别,可是没法肯定该级别。若是设置了此值,则会引起异常。??
当程序调用并发执行时,可要谨慎使用此方法。