Asp.net c#,在多个进程后回滚或提交

Asp.net c#,在多个进程后回滚或提交,asp.net,asp.net-mvc,advantage-database-server,Asp.net,Asp.net Mvc,Advantage Database Server,我想在多个进程之后使用Rollback()或commit()函数 没有错误,但它不会提交()以更新数据库 这是我的示例代码 public void startTransaction(){ using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string)) using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string)) {

我想在多个进程之后使用Rollback()或commit()函数

没有错误,但它不会提交()以更新数据库

这是我的示例代码

public void startTransaction(){
    using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string))
    using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string))
    {
        Ads_A_Connection.Open();
        Ads_B_Connection.Open();

        AdsTransaction aTxn = Ads_A_Connection.BeginTransaction();
        AdsTransaction bTxn = Ads_B_Connection.BeginTransaction();

        try{
            string aResult = this.process1(Ads_A_Connection);       
            this.process2(Ads_B_Connection, aResult);       
            this.process3(Ads_A_Connection. Ads_B_Connection);

            aTxn.Commit();
            bTxn.Commit();
            // there is no error, but it couldn't commit.
        }catch(Exception e){
            aTxn.Rollback();
            bTxn.Rollback();
        }
    }
}

public string process1(conn){
    // Insert data
    return result;
}

public void process2(conn. aResult){
    // update
}

public void process3(aConn, bConn){
    // delete
    // update
}
我猜,这是因为超出了使用范围。因为我试着把所有的代码放进 startTransaction()方法,然后它就可以工作了。但是它看起来太脏了

在多个(方法)进程之后,如何使用rollback()或commit()

任何人都知道,请给我建议

谢谢

[编辑]

我只是在连接之前添加TransactionScope

using (TransactionScope scope = new TransactionScope())
{
   using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string))
   using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string))
   {
     .
     .
但它出现了一个错误,它说“错误5047:事务命令的顺序无效。


我需要一点提示:)

交易范围是你的朋友


为了扩展Etch提到的内容,手动管理连接上的事务有几个问题:

  • 您需要在方法周围传递SQL连接
  • 完成后需要手动记住提交或回滚
  • 如果在一个事务下要管理多个连接,则应该真正使用DTC或XA将事务注册到分布式/2阶段事务中
TransactionScope与Advantage数据库服务器配合使用,尽管您需要启用,也可能需要启用XA遵从性

请注意,我假设advantage.NET客户端具有某种连接池机制——这使得获取连接的成本非常低

最终,这意味着您的代码可以重构为以下内容,更易于维护:

private void Method1()
{
    using(Ads_A_Connection = new AdsConnection(Ads_A_connection_string))
    {
        Ads_A_Connection.Open();
        string aResult = this.process1(Ads_A_Connection);       
    } // Can logically 'close' the connection here, although it is actually now held by the transaction manager
}

private void Method2()
{
    using(Ads_B_Connection = new AdsConnection(Ads_B_connection_string))
    {
        Ads_B_Connection.Open();
        this.process2(Ads_B_Connection, aResult);       
    } // Can logically 'close' the connection here, although it is actually now held by the transaction manager
}


public void MyServiceWhichNeedToBeTransactional(){
    using(TransactionScope ts = new TransactionScope()) { // NB : Watch isolation here. Recommend change to READ_COMMITTED
        try{
           Method1();
           Method2();
           ts.Complete();
        }
        catch(Exception e){
          // Do Logging etc. No need to rollback, as this is done by default if Complete() not called
        }
    }
}

首先提交内部/嵌套事务,然后提交外部事务re:5047-您是否已删除连接上的手动BeginTransaction()、commit()和Rollback()?这现在由TransactionScope.using System.Transactions管理;(C:\Program Files(x86)\Reference Assembly\Microsoft\Framework\.NETFramework\v4.5\System.Transactions.dll)