根据客户需要,一定要使用多数据库.现在有问题就是...在流程中会同时操作2个数据库...有什么办法可以同事对2个数据库进行事务.?

解决方案 »

  1.   

    你可以用存储过程来实现
    或者就是用ADO。NET事务
    下面是ADO.NET事务同时操作两个表的例子
    SqlTransaction objTrans = sqlconn.BeginTransaction();
    try
    {
    cm=sqlconn.CreateCommand();
    cm.CommandType=CommandType.Text;
    cm.CommandText="insert into OrderList(User_Name,Order_Date,Order_Price)"+
    "values(@User_Name,@Order_Date,@Order_Price)"+
    "select @@IDENTITY AS 'id'";

    cm.Parameters.Add("@User_Name",SqlDbType.NVarChar,50);
    cm.Parameters.Add("@Order_Date",SqlDbType.DateTime,8);
    cm.Parameters.Add("@Order_Price",SqlDbType.Money,8); cm.Parameters["@User_Name"].Value=username;
    cm.Parameters["@Order_Date"].Value=DateTime.Now.ToShortDateString();
    cm.Parameters["@Order_Price"].Value=cart.TotalPrice;
        cm.Transaction=objTrans;
    int id=Convert.ToInt32(cm.ExecuteScalar());

        cm.CommandText="insert into OrderItem(Order_Id,Goods_Id,Goods_Quantity,Unit_Cost)"+
                     "values(@Order_Id,@Goods_Id,@Goods_Quantity,@Unit_Cost)";
        cm.Parameters.Add("@Order_Id",SqlDbType.Int,4);
        cm.Parameters.Add("@Goods_Id",SqlDbType.Int,4);
        cm.Parameters.Add("@Goods_Quantity",SqlDbType.Int,4);
    cm.Parameters.Add("@Unit_Cost",SqlDbType.Money,8); foreach(object  obj in OrderHashtable)
    {

    GoodsOrder goodorder=(GoodsOrder)obj;

    cm.Parameters["@Order_Id"].Value=id;
    cm.Parameters["@Goods_Id"].Value=goodorder.Goods_ID;
    cm.Parameters["@Goods_Quantity"].Value=goodorder.Goods_Quantity;
    cm.Parameters["@Unit_Cost"].Value=goodorder.Sub_Total;
    cm.ExecuteNonQuery();
    }
     
    objTrans.Commit();    return id;
    }
        catch
    {
    objTrans.Rollback();
    int id=-1;
    return id;
    }
      

  2.   

    TO: lcj_ABC(luochangjin)
    呵呵..是啊...要的是2个数据库....一个数据库这样可以实现...TO: yaopeng117(尋找屬於自己的道,堅定不移的走下去。)
    我知道可以用存储过程...可是现在问题就是要在前端实现...T_T
      

  3.   

    SqlTransaction objTrans1 = sqlconn.BeginTransaction(); //数据库1
    SqlTransaction objTrans2 = sqlconn.BeginTransaction(); //数据库2try
    {
       //进行数据库操作   objTrans1.Commit();
       objTrans2.Commit();
    }
    catch
    {
      objTrans1.Rollback();
      objTrans2.Rollback();
    }这段代码没验证过,只要在Commit()时,不会出现错误的话,这段代码应该是能实现你的功能。
      

  4.   

    以我所知,目前要真正實現對多個數據庫,乃至多個不同服務器(或是MSSQL實體)上的數據庫實現事務,只有用COM+才能實現.
      

  5.   

    SqlTransaction objTrans1 = sqlconn.BeginTransaction(); //数据库1
    SqlTransaction objTrans2 = sqlconn.BeginTransaction(); //数据库2try
    {
       //进行数据库操作   objTrans1.Commit();
       objTrans2.Commit();
    }
    catch
    {
      objTrans1.Rollback();
      objTrans2.Rollback();
    }这段代码没验证过,只要在Commit()时,不会出现错误的话,这段代码应该是能实现你的功能。
      

  6.   

    应当用自动事务(也就是分布式事务)
    分布式事务可以支持多数据库,还支持数据库和消息队列的事务.
    参考msdn:
    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconautomatictransactionsnetframeworkclasses.htm
      

  7.   

    lcy00(lcy) 的方法不一定行吧的,当执行objTrans2.Commit()失败后(比如网络问题),无法回滚objTrans1,因为这个时候objTrans1已经提交了.
      

  8.   

    嗯...lcy00(lcy) 我也想到过...可是还是有漏洞的....万一数据弄错..要赔大了..T_T
      

  9.   

    怎么你不相信吗?
    应当用自动事务(也就是分布式事务)
    分布式事务可以支持多数据库,还支持数据库和消息队列的事务.
    参考msdn:
    ms-help://MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconautomatictransactionsnetframeworkclasses.htm
      

  10.   

    如果仅仅利用事务,要想保证绝对稳定,应该不可能的。因为会有可能出现无法解决的异常的。首先,两个数据库的commit一定会有先后顺序。例如,A库commit成功,接着commit B库
    这时,commitB库失败,无论是什么原因引起的,由于A库存的commit已经成功,那么,A库已经没有rollback的余地了。建议把软件用两个数据库的原因,和两个数据库之间的关系写出来,大家都想想办法。
      

  11.   

    具体原因是因为老板要把大工程分成小工程....其实一个数据库可以解决但没办法.....要跟着组织走啊.....
    谢谢大家的支持....最感谢的是 xxc1981(asf) ...最后还是用你给的分布式事务方法实现了...*^_^*
      

  12.   

    原来这个问题只有1、2个人答对啊,
    要用“分布式事务”,也就是“二次提交”啦,也就是说用COM+(其实是MTS),
    也就是把你的.net类写成COM+组件,也就在.net类上应用EnterpriceServiceAttribute
    也就是到Help上查一查该属性,也就是知道了吧!