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

posted @ 2008-04-22 14:48  peace  阅读(638)  评论(0编辑  收藏  举报