【问题标题】:Single sql transaction on multiple method多个方法上的单个 sql 事务
【发布时间】:2013-05-11 04:54:52
【问题描述】:

模块化编程是正确的方法,但它有时会导致需要额外努力和研究的问题。我有三个数据库插入函数,比如InsertName(),InsertAddress(),InsertPhoneNo(),以它为例。如果任何函数发生异常,所有这些函数都必须执行,不会对数据库进行任何更改。

我能做的就是将三者合二为一并使用sqltransaction。

InsertDetails()
{
using (SqlTransaction sqlTransaction = cn.BeginTransaction()) 
    {
      using (SqlCommand cm = new SqlCommand()) 
      {
        cm.Transaction = sqlTransaction;
        InsertName();//Code to insert name   
        Insertaddress();//code to insert address
        InsertPhoneNo();//code to insert phone no
      }
      sqlTransaction.Commit();
    }
}

但上面的解决方案与我的模块化方法背道而驰。是否可以将多个函数绑定到一个 sql 事务而不合并它们,如果没有,这是实现这一目标的最佳方法。

【问题讨论】:

    标签: c# sql database sqltransaction


    【解决方案1】:

    只需将cnsqlTransaction 传入函数,然后让函数使用传入的参数,而不是打开它们自己的连接。

    【讨论】:

      【解决方案2】:

      取决于您的代码在方法中的编写方式,但您可能想查看 TransactionScope 对象,因此您的代码如下所示:

      InsertDetails()
      {
          using (TransactionScope ts = new TransactionScope()) 
          {    
              InsertName();//Code to insert name   
              Insertaddress();//code to insert address
              InsertPhoneNo();//code to insert phone no
      
              ts.Complete();    
          }    
      }
      

      有关 MSDN 的更多信息,请点击此处:

      http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

      【讨论】:

      • 附带说明 - 您需要查看方法中的代码以查看这是否合适,并确保您将事务保存在数据库中而不是将其升级为分布式事务!
      【解决方案3】:

      在设计良好的分布式架构(简化和以数据库为中心)中,您将(至少)有层和域实体层(其他层将依赖于支配实体层)

      用户界面
      服务
      数据访问
      通用(域实体)

      它们之间的依赖关系是自上而下的,所以
      用户界面有对服务的引用,对数据访问的服务,所有层都依赖于域实体

      每个域实体我们将有一个单独的服务,例如,如果我们有一个 Customer Table 和一个 Order table,我们将有:
      CustomerEntityOrderEntity(域实体对象)
      @ 987654328@ 和 OrderService(服务层对象)
      CustomerDACustomerDA(数据访问层对象)

      通常,任何 DataAccess 对象都会对其域实体执行插入、更新、删除操作并且不会干扰其他实体的 CRUD 操作
      第二个角色是任何服务对象都必须调用它自己的肠炎数据访问对象。

      回答您问题的关键点在这里:
      Service layer objects can call other services,所以一个名为 UpdateCustomerNameAndUpdateAllHisOrders(CustomerEntity) 的示例服务customer) // 一个很长的名字
      可以在 CustomerService 类中实现,概念上如下:

      UpdateCustomerNameAndUpdateAllHisOrders(CustomerEntity customer)
      {
        //StartTransaction();
        CustomerDa.Update(customer);
        var orders = OrderService.GetAllOrders(customer);
        //Modify Orders logic
        OrderService.UpdateOrders(orders);
        //CommiteTransaction();
      }
      

      为了数据的完整性,事务是从服务层管理的
      @Scott Chamberlain 的回答会以自己的方式这样做

      对于服务层事务管理,您可能会看到here
      Spring.Net Framework 是一个很好的示例as an aspect
      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 2017-04-12
        • 1970-01-01
        • 2020-02-07
        相关资源
        最近更新 更多