文章目录
- 一、概述
- 1、事务ACID特性
- 2、.NET开发者用到的5种事务机制:
- 二、数据库事务
- 1、不同数据库的事务规则
- 2、数据库事务的优势和限制
- 三、ADO.Net事务
- 四、System.EnterpriseServices自动事务处理
- 五、System.Transactions事务
- 1、显式事务(Explicit Transaction)
- 2、Transaction类的派生类
- 3、Transaction类成员
- 六、可提交的事务:CommitableTransaction(显式事务)
- 七、环境事务:TrasactionScope(隐式事务,推荐)
- 1、隔离级别IsolationLevel
- 2、嵌套环境事务
- 3、TransactionScopeOption
- 4、MSDTC组件设置:
- 八、依赖事务DependentTransaction,跨多个线程调用事务(显式事务)
一、概述
1、事务ACID特性
事务将一系列的工作视为一个工作单元,它具有 ACID 特性:
A:Atomicity 不可分性
也就是说事务中有多项工作,如果有一项工作失败了,整个事务就算失败了。
C:Consistency 一致性
事务完成时,全部数据必须维持一致性的状态。对于关系数据库,简单地来说就是没有破坏数据完整性。
I:Isolation 隔离性
事务与其他事务是隔离的,也就是说一个事务的一项工作对数据进行修改时,如果整个事务还没有结束,其他事务就无法知道这个数据发生了修改。
D:Durability 持久性
事务完成后,其作用便永远存在于系统之中。
2、.NET开发者用到的5种事务机制:
SQL和存储过程级别的事务。(数据库事务)
ADO.NET级别的事务。
ASP.NET页面级别的事务。
企业级服务COM+事务。
System.Transactions 事务处理。
这5种事务机制有着各自的优势和劣势,分别表现在性能、代码数量和部署设置等方面。开发人员可以根据项目的实际情况选择相应的事务机制。
二、数据库事务
1、不同数据库的事务规则
数据库事务是其他事务模型的基础,当一个事务创建时不同数据库系统都有自己的规则。
SQL Server默认在自动提交的模式下工作,每个语句执行完后都会立即提交;
Oracle则需要你包含一个提交语句。
当一个语句通过OLE DB执行时,它执行完后一个提交动作会被附加上去。
例如:SQL Server数据库T-SQL语句中显示指定事务
declare @TranName varchar(20);
select @TranName = 'MyTransaction';begin transaction @TranName;
gouse AdventureWorks;
godelete from AdventureWorks.HumanResources.JobCandidate where JobCandidateID = 13;
gocommit transaction MyTransaction;
go
或在存储过程中使用
create procedure Tran1
asbegin tran;set xact_abort on; --set xact_abort on表示遇到错误立即回滚。insert into P_Category ( CategoryId, Name ) values ( '1', 'test1' );insert into P_Category ( CategoryId, Name ) values ( '2', 'test2' );commit tran;
go
2、数据库事务的优势和限制
(1)优势:
所有的事务逻辑包含在一个单独的调用中。
拥有运行一个事务的最佳性能。
独立于应用程序。
(2)限制:
事务上下文仅存在于数据库调用中。
数据库代码与数据库系统有关。
三、ADO.Net事务
ADO.Net事务为System.Data.Common.DbTransaction类的各种派生类。ADO.Net事务不是分布式事务,不支持跨多个连接,它总是关联到一个连接上的本地事务上。
ADO.NET 显式事务占用资源少、速度快,但功能简单,只能管理单一对象和单一持久资源间的事务。
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MySqlServer"].ConnectionString))
{conn.Open();using (SqlTransaction tran = conn.BeginTransaction()){using (SqlCommand cmd = new SqlCommand()){cmd.Connection = conn;cmd.Transaction = tran;cmd.CommandType = CommandType.Text;try{cmd.CommandText = "insert into TranTable(Priority) values(1)";cmd.ExecuteNonQuery();cmd.CommandText = "insert into TranTable(Priority) values(256)";cmd.