码迷,mamicode.com
首页 > Web开发 > 详细

.NET中四种常用事物

时间:2015-09-16 19:38:19      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:

在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务 处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。
1 SQL事务
    sql事务是使用SQL server自身的事务:在存储过程中直接使用Begin Tran,Rollback Tran,Commit Tran实现事务:
优点:执行效率最佳
限制:事务上下文仅在数据库中调用,难以实现复杂的业务逻辑。
Demo:(所有demo,都以SQL Server自带的Northwind数据的表Region为例)

技术分享
技术分享CREATE PROCEDURE dbo.SPTransaction
技术分享    (
技术分享    @UpdateID int,
技术分享    @UpdateValue nchar(50),
技术分享    @InsertID int,
技术分享    @InsertValue nchar(50)
技术分享    )
技术分享AS
技术分享begin Tran
技术分享Update Region  Set RegionDescription=@UpdateValue where RegionID=@UpdateID
技术分享
技术分享insert into Region Values (@InsertID,@InsertValue)
技术分享
技术分享declare @RegionError int
技术分享select @RegionError=@@error
技术分享if(@RegionError=0)
技术分享COMMIT Tran
技术分享else
技术分享ROLLBACK Tran
技术分享GO
技术分享
技术分享
技术分享/// <summary>
技术分享        /// SQL事务:
技术分享        /// </summary>
技术分享        public void SQLTran()
技术分享        {
技术分享            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
技术分享            SqlCommand cmd = new SqlCommand();
技术分享            cmd.CommandText = "SPTransaction";
技术分享            cmd.CommandType = CommandType.StoredProcedure;
技术分享            cmd.Connection = conn;
技术分享            conn.Open();
技术分享            SqlParameter[] paras= new SqlParameter[]{
技术分享                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
技术分享                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50),
技术分享                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
技术分享                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
技术分享            paras[0].Value = "2";
技术分享            paras[1].Value = "Update Value1";
技术分享            paras[2].Value = "6";
技术分享            paras[3].Value = "Insert Value1";
技术分享            foreach (SqlParameter para in paras )
技术分享            {
技术分享                cmd.Parameters.Add(para);
技术分享            }
技术分享            cmd.ExecuteNonQuery();   
技术分享        }


2 ADO.net事务
   Ado.net事务可能是大家一般都用的
 优点:简单,效率和数据库事务差不多。
 缺点:事务不能跨数据库,只能在一个数据库连接上。如果是两个数据库上就不能使用该事务了。
Demo:

技术分享
技术分享/// <summary>
技术分享        /// 一般的ADO.net 事务
技术分享        /// </summary>
技术分享        public void ADONetTran1()
技术分享        {
技术分享            SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
技术分享            SqlCommand cmd = new SqlCommand();
技术分享            try
技术分享            {
技术分享                cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
技术分享                cmd.CommandType = CommandType.Text;
技术分享                cmd.Connection = conn;
技术分享                conn.Open();
技术分享                SqlParameter[] paras = new SqlParameter[]{
技术分享                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
技术分享                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
技术分享                paras[0].Value = "2";
技术分享                paras[1].Value = "Update Value12";
技术分享
技术分享                foreach (SqlParameter para in paras)
技术分享                {
技术分享                    cmd.Parameters.Add(para);
技术分享                }
技术分享                //开始事务
技术分享                cmd.Transaction = conn.BeginTransaction();
技术分享                cmd.ExecuteNonQuery();
技术分享
技术分享
技术分享                cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
技术分享                cmd.CommandType = CommandType.Text;
技术分享
技术分享                paras = new SqlParameter[]{
技术分享                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
技术分享                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
技术分享                paras[0].Value = "7";
技术分享                paras[1].Value = "Insert Value";
技术分享
技术分享                cmd.Parameters.Clear();
技术分享                foreach (SqlParameter para in paras)
技术分享                {
技术分享                    cmd.Parameters.Add(para);
技术分享                }
技术分享                
技术分享                cmd.ExecuteNonQuery();
技术分享                //提交事务
技术分享                cmd.Transaction.Commit();
技术分享            }
技术分享            catch
技术分享            {
技术分享                //回滚事务
技术分享                cmd.Transaction.Rollback();
技术分享                throw;
技术分享            }
技术分享            finally
技术分享            {
技术分享                conn.Close();
技术分享            }
技术分享
技术分享        }

3 TransactionScope事务
  TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务
 优点:实现简单,同时能够自动提升为分布式事务
Demo:

技术分享
技术分享 /// <summary>
技术分享        /// TransactionScope事务:可自动提升事务为完全分布式事务的轻型(本地)事务。 
技术分享        /// 使用时要保证MSDTC服务(控制分布事务)是开启的可以使用:net start msdtc命令开启服务;
技术分享        /// </summary>
技术分享        public void ADONetTran2()
技术分享        {
技术分享             SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");
技术分享             SqlCommand cmd = new SqlCommand();
技术分享            try
技术分享            {
技术分享              
技术分享                using (System.Transactions.TransactionScope ts = new TransactionScope())
技术分享                {
技术分享                    
技术分享                    cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";
技术分享                    cmd.CommandType = CommandType.Text;
技术分享                    cmd.Connection = conn;
技术分享                    conn.Open();
技术分享                    SqlParameter[] paras = new SqlParameter[]{
技术分享                                        new SqlParameter ("@UpdateID",SqlDbType.Int,32),
技术分享                                        new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};
技术分享                    paras[0].Value = "2";
技术分享                    paras[1].Value = "Update Value12";
技术分享
技术分享                    foreach (SqlParameter para in paras)
技术分享                    {
技术分享                        cmd.Parameters.Add(para);
技术分享                    }
技术分享                    cmd.ExecuteNonQuery();
技术分享
技术分享
技术分享                    cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";
技术分享                    cmd.CommandType = CommandType.Text;
技术分享
技术分享                    paras = new SqlParameter[]{
技术分享                                        new SqlParameter ("@InsertID",SqlDbType.Int ,32),
技术分享                                        new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};
技术分享                    paras[0].Value = "8";
技术分享                    paras[1].Value = "Insert Value";
技术分享
技术分享                    cmd.Parameters.Clear();
技术分享                    foreach (SqlParameter para in paras)
技术分享                    {
技术分享                        cmd.Parameters.Add(para);
技术分享                    }
技术分享
技术分享                    cmd.ExecuteNonQuery();
技术分享                    //提交事务
技术分享                    ts.Complete();
技术分享                }
技术分享            }
技术分享            catch
技术分享            {
技术分享                throw;
技术分享            }
技术分享            finally
技术分享            {
技术分享                conn.Close();
技术分享            }
技术分享
技术分享        }

4 COM+事务
  在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
Demo:

技术分享该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
)下面是MSDN上关于配置分布式事务的一段原话:
配置分布式事务
要启用分布式事务,可能需要通过网络启用 MS DTC,以便在使用应用了最新的 Service Pack 的较新操作系统(例如 Windows XP 或 Windows 2003)时使用分布式事务。如果启用了 Windows 防火墙(Windows XP Service Pack 2 的默认设置),必须允许 MS DTC 服务使用网络或打开 MS DTC 端口。
实际怎么配置呢,经过我的实际使用:大致如下:打开‘控制面板‘->‘管理工具‘->‘组件服务‘,点开‘组件服务 ‘->‘计算机‘->‘我的电脑‘,在‘我的电脑‘上右击属性,点‘MSDTC‘,然后点‘安全性配置‘。作为数据库的服务器的配置如下:
技术分享

 

而访问数据库的客户端的配置和服务器端的稍有些差别:

技术分享
在设置完上面的还有使防火墙MS DTC 服务使用网络或打开 MS DTC 端口:运行netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable命令就可以了

.NET中四种常用事物

标签:

原文地址:http://www.cnblogs.com/tiancai/p/4813895.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!