在1个项目中,此项目有大量的跨2台服务器,对2个SQLSERVER数据库的操作,而且有非常严格的事务要求.百度了很久,找到了以下两种方法! 请问:以下2种方法稳妥么?选择哪个好些? 如果这2种都不好,更优的方法是?关系项目成败! 高手一定帮忙!先谢啦! 

解决方案 »

  1.   

    方法1:
    try
                {
                    using (TransactionScope scope = new TransactionScope())
                    {
                        //更新northwind数据库的Employees表
                        using (SqlConnection conOne = new SqlConnection("server=.;uid=sa;pwd=123;database=northwind"))
                        {
                            conOne.Open();                        SqlCommand command = new SqlCommand("update Employees set lastname='chen' where employeeid='1'", conOne);
                            int i = command.ExecuteNonQuery();
                        }                    //更新pubs数据库的jobs表
                        using (SqlConnection conTwo = new SqlConnection("server=.;uid=sa;pwd=123;database=pubs"))
                        {
                            conTwo.Open();
                            SqlCommand command = new SqlCommand("update jobs set job_desc='chen' where job_id='1'", conTwo);
                            int i = command.ExecuteNonQuery();
                        }                    scope.Complete();  //提交事物
                    }
                }
                catch (Exception ex)       //发生异常后自动回滚
                {                //throw;
                }
      

  2.   

    方法2:
     SqlConnection conNorthwind = new SqlConnection("server=.;uid=sa;pwd=123;database=northwind");
                SqlConnection conPubs = new SqlConnection("server=.;uid=sa;pwd=123;database=pubs");            SqlCommand commandNorthwind = new SqlCommand();
                SqlCommand commandPubs = new SqlCommand();
                try
                {
                    conNorthwind.Open();
                    conPubs.Open();                //更新northwind数据库的Employees表
                    SqlTransaction tranNorthwind = conNorthwind.BeginTransaction();
                    commandNorthwind.Connection = conNorthwind;
                    commandNorthwind.Transaction = tranNorthwind;
                    commandNorthwind.CommandText = "update Employees set lastname='chen' where employeeid='1'";
                    int i = commandNorthwind.ExecuteNonQuery();                //更新pubs数据库的jobs表
                    SqlTransaction tranPubs = conPubs.BeginTransaction();
                    commandPubs.Connection = conPubs;
                    commandPubs.Transaction = tranPubs;
                    commandPubs.CommandText = "update jobs set job_desc='chen' where job_id='1'";
                    int k = commandPubs.ExecuteNonQuery();                //throw new Exception();                //提交事务
                    commandNorthwind.Transaction.Commit();
                    conNorthwind.Close();                commandPubs.Transaction.Commit();
                    conPubs.Close();
                }
                catch (Exception ex)
                {                //回滚事务
                    if (commandNorthwind.Transaction != null && conNorthwind != null)
                    {
                        commandNorthwind.Transaction.Rollback();
                        conNorthwind.Close();
                    }                if (commandPubs.Transaction!= null && conPubs != null)
                    {
                        commandPubs.Transaction.Rollback();
                        conPubs.Close();
                    }
                    //throw;
                }
      

  3.   

    没有可靠并且性能稍微靠谱的方法。如果你是银行,那么找一台高性能的小型机。如果你是其它行业,那么考虑“非常严格的事务要求”这个说法是否合理。考虑你选择“SQL Server”是否合理。
      

  4.   

    TransactionScope更多地知识一个噱头、名词儿而已。当它是针对SQL Server那么它就是在内部调用SQL Server的trans而已。msdn的例子你见过真正跨数据库的TransactionScope吗?msdn上的TransactionScope的范例都是骗人的,根本不是跨数据库系统的。如果有人不同意,那么请举出msdn上跨数据库的TransactionScope的、并且你在实际项目使用中经得起最基本业务一致性和压力测试的实际例子来。如果能够举出哪一个msdn页面来,那么我可以重新考虑我自从干软件以来对微软的SQL Server的基础知识是否具备的问题。
      

  5.   

    无所谓哪一个“更优”的问题。这就是普通的transaction。这就好像你写using(var trans1= conn1.BeginReansaction())
    using(var trans2= conn2.BeginTransaction())
    {
        .....分别处理两个数据库操作
    }一样。这无所谓“更优”。最好的办法就是在业务上进行安排和设计,不要依赖数据库事务。比如说有几百个点联网卖票,难道一个点卖票的过程中要理解为“数据库事务”?根本不可能。人家会先把票从“待卖”移动到“正在交易”中包括起来,然后假设没有成功卖出,则过3分钟就会自动放回到“待卖”中再此投入使用。而不会弄个简单的“数据库事务”这种纸上谈兵的技术。
      

  6.   

    楼主没考虑过用integration service吗?
      

  7.   

    你这两个方法其实就是一个方法,只是写代码时变了下花样。事务是由事务管理器控制的,当在同一个应用程序域中,并且登记到事务中的持久化资源管理器是同样是,会使用LTM(LightWeight Transaction Manager)事务管理器进行管理。当登记的是NTFS文件系统下的文件资源时,会使用内核事务管理器进行管理。如果涉及跨应用程序域,网络时,使用分布式事务管理器(DTC)进行管理。这三种事务管理器是由系统根据自动决定的,事务的提升也是自动的,你这种情况就会自动使用分布式事务管理器进行管理。使用DTC,需要从服务中开启Distributed Transaction Coordinator服务.但是,之前使用分布式事务感觉不是很好,因为同时依赖两个远程的数据库,你可以另外做一套和事务同样处理方式的机制,分两阶段,先提交(这时不生效),后确认,如果任何一步有问题时则撤销已提交的操作。
      

  8.   

    方法还是有的, 你参考这个吧,
    http://eatpockyboy.blog.163.com/blog/static/116734640201010631937236/