oracle数据库与SQL Server数据库中的的分布式事物处理

先说下Oracle里的事物处理与应用,之所以会应用事物,就是为了保证一整套逻辑中涉及数据库操作的数据完整性,比如系统中涉及money收支的问题,难免要进行数据库插入操作和更新操作,有时候这里的更新不仅仅是更新本服务器,而且会涉及跨服务器更新。oracle里的分布式不像在SQL SERVER里可以直接引用,oracle没有直接提供,而是作为一个事物插件单独发行的(文件有点大,80MB左右,有需要的我可以稍后再贴处理),下面以oracle9i中的调用为例说明:
  程序里添加VS的内置引用 System.EnterpriseServices ,添加引用后我们可以写一个事物操作的类,在需要的地方调用

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.EnterpriseServices;

namespace  TranScope
{
    
public   class  ESTransactionScope : IDisposable

   {
      
      
public   void  Dispose()
      {                 

         
if ( ! this .Consistent)

         {
            ContextUtil.SetAbort();
         }

         ServiceDomain.Leave();

      }

      
public   void  Complete()

      {
         
this .Consistent  =   true ;
      }   

      
public  ESTransactionScope()

      {                 
         EnterTxContext(TransactionOption.Required);
      }

      
public  ESTransactionScope(TransactionOption txOption)

      {
         EnterTxContext(txOption);
      }

      
private   void  EnterTxContext(TransactionOption txOption)

      {
         ServiceConfig config 
=   new  ServiceConfig(); 

         config.Transaction 
=  txOption; 

         ServiceDomain.Enter(config);           

      }

      
private   bool  Consistent  =   false ;

   }

}

调用的就可以这样来了: 
using (TranScope t = new TranScope ())//标明事务范围
        {
            try
            {
                //这里放一系列的逻辑操作
                 User.Add(user_info)// 插入操作
                 SysPara.Update()//更新操作
                 Server10.AddUser(user_info) //将数据写到另一台服务器
                 Logger.Add(LogInfo);// 日志记录             
                t.Complete();
            }
            catch
            {
                Fun.Alert("操作失败!");
            }
        }

如果出错的话本服务器和另一台服务器的数据都会执行回滚操作,除非t.Complete()方法成功执行

在SQL SERVER里调用分布式事物可能要方便点,可以这么用
SqlConnection myConnection = new SqlConnection("Data Source=.;Initial Catalog=TEST;Integrated Security=SSPI;");
        myConnection.Open();
        // 启动一个事务
        SqlTransaction myTrans = myConnection.BeginTransaction();

        // 为事务创建一个命令
        SqlCommand myCommand = new SqlCommand();
        myCommand.Connection = myConnection;
        myCommand.Transaction = myTrans;
        try
        {
            myCommand.CommandText = "Insert into T1(ID, NAME) VALUES (103, 'XO')";
            myCommand.ExecuteNonQuery();
            myCommand.CommandText = "Insert into T2(ID, NAME) VALUES (101, 'NB')";
            myCommand.ExecuteNonQuery();
            myTrans.Commit();
            Console.WriteLine("OK.");
        }
        catch (Exception ex)
        {
            myTrans.Rollback();
            Console.WriteLine(ex.ToString());
        }
        finally
        {
            myConnection.Close();
        }
这么用就不太好了,如果是复杂的逻辑处理,可能就很不好搞了,最好还是在事物处理时与数据连接分离开来,只需要把想要的操作方法放到事物块里就好了
也同上面一样,上面那个事物类在也是适用与SQL SERVER数据库的,而且调用也是一样的,不同的是SQL SERVER里调用不用装什么插件的,但是要保证事物能正确有效有几个地方需要设置,首先DTS服务肯定是要开启的,使用分布式事物这个是必须的,还有个地方要配置下如下图:

几个选项勾选上,还有一点就是访问的数据库服务器的防火墙开启的话有时候会有影响,关掉就没问题了。关于SQL SERVER里的分布式事物,园子里的jillzhang写过一篇文章很好的还做了对比分析,和我说的调用方式不太一样,地址如下:
http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html

转载于:https://www.cnblogs.com/peaceli/archive/2008/04/22/1163011.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值