




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
步步为营 C# 技术漫谈 七、事务处理(Transaction) 概述事务必须具有原子性、一致性、隔离性和持久性。虽然首字母缩写词容易记忆,但是每个词的含义不是很明显。以下是简要说明。 原子性(Atomicity):原子性可确保要么执行所有更新,要么什么也不发生。由于事务中的原子性保障,开发人员不必编写代码来处理更新成功而另一个没有成功的情况。 一致性(Consistency):一致性意味着事务的结果使得系统保持一致状态。在事务启动之前,数据保持有效的状态,这与事务结束时一样。一致性还确保了事务必须使得数据库保持一致状态,如果事务的部分操作失败,则其他部分也必须回到原来的状态。 隔离性(Isolation):多个用户可能同时访问同一个数据库。使用隔离性能够保证在事务完成之前,该事务外部不能看到事务中的数据改变。也不能访问一些中间状态,如果事务终止这些状态将不会发生。 持久性(Durability):持久性意味着即使是系统崩溃也能够保证一致性状态。如果数据库系统崩溃,则持久性必须保证已经提交的事务确实写入了数据库。事务类型 事务分为本地事务和分布式事务两种类型。 本地事务:该类型事务使用已知数据源(例如SQL Server),同时还是单阶段事务。若单个数据库中保存了所有有关事务的数据,对自身可以强制使用ACID规则。这意味着在单个数据库服务器中(例如SQL Server),只要使用同一个连接,则可以跨数据库使用本地事务。 分布式事务:该类型事务使用多个已知事务数据源。分布式行为可能需要从消息队列服务器中读取消息,从SQL Server数据库中获取数据,以及将消息写入其他数据库。 一些软件包(例如MSDTC)能够以编程方式辅助实现分布式事务,通过使用一些方法(例如两阶段提交和回滚)能够控制跨越所有数据源的提交和回滚行为,以便保证集成性。MSDTC仅可用于兼容事务管理接口的应用程序。当前可用的应用程序有MSMQ、SQL Server、Oracle、Sybase和其他当前可用的应用程序(称为资源管理器)。 两阶段提交 在分布式事务环境中,不同的资源管理器需要实现可靠的提交协议,最为常见的实现是两阶段提交。在两阶段提交中,实际的提交工作分为两个阶段: 第一个阶段包括为提交准备一些所需的更改。这样,RM(资源管理器)就会与事务协调器通信,告知其更新准备已经就绪,准备执行提交,但实际还不进行提交。 一旦所有资源管理器都告知事务协调器准备工作就绪,那么事务协调器将使所有参与者都了解继续工作准备好,接着执行更改。 在两阶段提交中,单个或者多个数据库能够参与分布式事务。实际上,任何在MSDTC事务中登记的对象都能够参与由MSDTC管理的分布式事务。例如,MSMQ能够参与由两个SqlConnection对象连接两个不同数据库的事务。简单描述两阶段提交显然过于简单化,而深入讲解两阶段提交又超出了本书范围。既然读者对事务有了初步认识,就能够理解.NET 1.x提供的针对事务过程的支持。四种事务处理一、SQL事务sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务: 优点:执行效率最佳 限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。 示例:( SQL Server自带的AdventureWorks数据为例) 带事务的储存过程:?123456789101112131415161718CREATE PROCEDURE dbo.spModifyAddress ( City nvarchar(30), AddressID int, PostalCode nvarchar(15), Name nvarchar(50), ) AS begin Tran Update Address Set City=City,PostalCode=PostalCode where AddressID=AddressID update AddressType set Name = Name where AddressTypeID = AddressID declare UpdateError intselect UpdateError=error if(UpdateError=0) COMMIT Tran elseROLLBACK Tran GO调用:?1234567891011121314151617181920212223public void SQLTran() SqlConnection conn = new SqlConnection(Data Source=;Initial Catalog=AdventureWorks;Persist Security Info=True;User ID=sa;Password=123;); SqlCommand cmd = new SqlCommand(); cmd.CommandText = spModifyAddress; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); SqlParameter paras = new SqlParameter new SqlParameter (AddressID,SqlDbType.Int,4), new SqlParameter (City,SqlDbType.NVarChar,30), new SqlParameter (PostalCode,SqlDbType.NVarChar,32), new SqlParameter (Name,SqlDbType.NVarChar ,50); paras0.Value = 2; paras1.Value = zhejang; paras2.Value = 315000; paras3.Value = group; foreach (SqlParameter para in paras) cmd.Parameters.Add(para); cmd.ExecuteNonQuery(); 二、ADO.net事务A事务可能是大家一般都用的 优点:简单,效率和数据库事务差不多。 缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。 示例:?1234567891011121314151617181920212223242526272829303132333435363738394041424344public void SQLTran() SqlConnection conn = new SqlConnection(Data Source=;Initial Catalog=AdventureWorks;Persist Security Info=True;User ID=sa;Password=123;); SqlTransaction sqlTran = conn.BeginTransaction(); SqlCommand cmd = new SqlCommand(); cmd.CommandText = spModifyAddress; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); cmd.Transaction = sqlTran; AddParameter(cmd); try cmd.ExecuteNonQuery(); sqlTran.Commit(); catch sqlTran.Rollback(); finally conn.Dispose(); sqlTran.Dispose(); private void AddParameter(SqlCommand cmd) SqlParameter paras = new SqlParameter new SqlParameter (AddressID,SqlDbType.Int,4), new SqlParameter (City,SqlDbType.NVarChar,30), new SqlParameter (PostalCode,SqlDbType.NVarChar,32), new SqlParameter (Name,SqlDbType.NVarChar ,50); paras0.Value = 2; paras1.Value = zhejang; paras2.Value = 315000; paras3.Value = group; foreach (SqlParameter para in paras) cmd.Parameters.Add(para); 三、TransactionScope事务 TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务 优点:实现简单,同时能够自动提升为分布式事务。 使用时要保证MSDTC服务(控制分布事务)是开启的可以使用 可以使用开启服务命令:net start msdtc 还有使防火墙MS DTC 服务使用网络或打开 MS DTC 端口 命令:netsh firewall set allowedprogram %windir%system32msdtc.exe MSDTC enable?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public void SQLTran() SqlConnection conn = new SqlConnection(Data Source=;Initial Catalog=AdventureWorks;Persist Security Info=True;User ID=sa;Password=123;); using (TransactionScope ts = new TransactionScope() SqlCommand cmd = new SqlCommand(); cmd.CommandText = spModifyAddress; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); AddParameter(cmd); try cmd.ExecuteNonQuery(); ts.Complete(); catch throw; finally conn.Dispose(); ts.Dispose(); private void AddParameter(SqlCommand cmd) SqlParameter paras = new SqlParameter new SqlParameter (AddressID,SqlDbType.Int,4), new SqlParameter (City,SqlDbType.NVarChar,30), new SqlParameter (PostalCode,SqlDbType.NVarChar,32), new SqlParameter (Name,SqlDbType.NVarChar ,50); paras0.Value = 2; paras1.Value = zhejang; paras2.Value = 315000; paras3.Value = group; foreach (SqlParameter para in paras) cmd.Parameters.Add(para); ?1?1四、COM+事务在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。示例:?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455public void SQLTran() SqlConnection conn = new SqlConnection(Data Source=;Initial Catalog=AdventureWorks;Persist Security Info=True;User ID=sa;Password=123;); ServiceConfig sc = new ServiceConfig(); sc.Transaction = TransactionOption.Required; sc.TrackingEnabled = true; ServiceDomain.Enter(sc); SqlCommand cmd = new SqlCommand(); cmd.CommandText = spModifyAddress; cmd.CommandType = CommandType.StoredProcedure; cmd.Connection = conn; conn.Open(); AddParameter(cmd); try cmd.ExecuteNonQuery(); ContextUtil.SetComplete(); catch ContextUtil.SetAbort(); throw; finally conn.Dispose(); ServiceDomain.Leave(); private void AddParameter(SqlCommand cmd) SqlParameter paras = new SqlParameter new SqlParameter (AddressID,SqlDbType.Int,4), new SqlParameter (City,SqlDbType.NVarChar,30), new SqlParameter (PostalCode,SqlDbType.NVarChar,32), new SqlParameter (Name,SqlDbType.NVarChar ,50); paras0.Value = 2; paras1.Value = zhejang; paras2.Value
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GSK2636771-Standard-生命科学试剂-MCE
- 2025航天科工天隼实验室招聘4人模拟试卷附答案详解(黄金题型)
- 2025年河南省上蔡第一高级中学招聘教师30人模拟试卷及答案详解(网校专用)
- 2025年户外机柜温控节能项目合作计划书
- 安全培训效果点评课件
- 企业信誉与发展规划承诺函9篇
- 美食电商美食节促销计划
- 2025年甘肃省兰州眼科医院(兰州市第一人民医院眼科)招聘考前自测高频考点模拟试题参考答案详解
- 小学交通安全培训简报课件
- 2025届春季中核集团人才计划招聘模拟试卷附答案详解(突破训练)
- 实施项目经理岗位的工作职责描述
- 医院物业服务投标方案
- 中频操作评分标准
- 国家免疫规划疫苗儿童免疫程序说明-培训课件
- 生活中的理财原理知到章节答案智慧树2023年暨南大学
- GB/T 22588-2008闪光法测量热扩散系数或导热系数
- GB/T 22237-2008表面活性剂表面张力的测定
- GB/T 13298-1991金属显微组织检验方法
- 《绿色建筑概论》整套教学课件
- 建筑设计防火规范2001修订版
- 电工基础培训教材课件
评论
0/150
提交评论