频道栏目
首页 > 程序开发 > 软件开发 > C# > 正文
步步为营C#技术漫谈七、事务处理(Transaction)
2011-06-28 18:58:23      个评论      
收藏   我要投稿

概述

事务必须具有原子性、一致性、隔离性和持久性。虽然首字母缩写词容易记忆,但是每个词的含义不是很明显。以下是简要说明。
  ●    原子性(Atomicity):原子性可确保要么执行所有更新,要么什么也不发生。由于事务中的原子性保障,开发人员不必编写代码来处理更新成功而另一个没有成功的情况。
  ●    一致性(Consistency):一致性意味着事务的结果使得系统保持一致状态。在事务启动之前,数据保持有效的状态,这与事务结束时一样。一致性还确保了事务必须使得数据库保持一致状态,如果事务的部分操作失败,则其他部分也必须回到原来的状态。
  ●    隔离性(Isolation):多个用户可能同时访问同一个数据库。使用隔离性能够保证在事务完成之前,该事务外部不能看到事务中的数据改变。也不能访问一些中间状态,如果事务终止这些状态将不会发生。
  ●    持久性(Durability):持久性意味着即使是系统崩溃也能够保证一致性状态。如果数据库系统崩溃,则持久性必须保证已经提交的事务确实写入了数据库。

 

事务类型
事务分为本地事务和分布式事务两种类型。
  ●    本地事务:该类型事务使用已知数据源(例如SQL Server),同时还是单阶段事务。若单个数据库中保存了所有有关事务的数据,对自身可以强制使用ACID规则。这意味着在单个数据库服务器中(例如SQL Server),只要使用同一个连接,则可以跨数据库使用本地事务。
  ●    分布式事务:该类型事务使用多个已知事务数据源。分布式行为可能需要从消息队列服务器中读取消息,从SQL Server数据库中获取数据,以及将消息写入其他数据库。
一些软件包(例如MSDTC)能够以编程方式辅助实现分布式事务,通过使用一些方法(例如两阶段提交和回滚)能够控制跨越所有数据源的提交和回滚行为,以便保证集成性。MSDTC仅可用于兼容事务管理接口的应用程序。当前可用的应用程序有MSMQ、SQL Server、OracleSybase和其他当前可用的应用程序(称为资源管理器)。
两阶段提交
在分布式事务环境中,不同的资源管理器需要实现可靠的提交协议,最为常见的实现是两阶段提交。在两阶段提交中,实际的提交工作分为两个阶段:
  ●    第一个阶段包括为提交准备一些所需的更改。这样,RM(资源管理器)就会与事务协调器通信,告知其更新准备已经就绪,准备执行提交,但实际还不进行提交。
  ●    一旦所有资源管理器都告知事务协调器准备工作就绪,那么事务协调器将使所有参与者都了解继续工作准备好,接着执行更改。
在两阶段提交中,单个或者多个数据库能够参与分布式事务。实际上,任何在MSDTC事务中登记的对象都能够参与由MSDTC管理的分布式事务。例如,MSMQ能够参与由两个SqlConnection对象连接两个不同数据库的事务。简单描述两阶段提交显然过于简单化,而深入讲解两阶段提交又超出了本书范围。既然读者对事务有了初步认识,就能够理解.NET 1.x提供的针对事务过程的支持。

 

四种事务处理

一、SQL事务

sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:

优点:执行效率最佳

限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。

示例:( SQL Server自带的AdventureWorks数据为例)

带事务的储存过程:

CREATE 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 int
select @UpdateError=@@error
if(@UpdateError=0)
COMMIT Tran
else
ROLLBACK Tran
GO

 

调用:

        public void SQLTran()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;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)};
            paras[0].Value = "2";
            paras[1].Value = "zhejang";
            paras[2].Value = "315000";
            paras[3].Value = "group";
            foreach (SqlParameter para in paras)
            {
                cmd.Parameters.Add(para);
            }
            cmd.ExecuteNonQuery();
        }

 

二、ADO.net事务

Ado.net事务可能是大家一般都用的

优点:简单,效率和数据库事务差不多。

缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。

示例:

       public void SQLTran()
        {
            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;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
&n

点击复制链接 与好友分享!回本站首页
相关TAG标签 事务 技术
上一篇:步步为营C# 术漫谈六、线程控制(Thread)
下一篇:Question:关于C#连续赋值的面试题
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站