多个方法上的单个sql事务

时间:2013-05-11 04:54:52

标签: c# sql database sqltransaction

模块化编程是正确的方法,但它有时会导致需要额外努力和研究的问题。我有三个数据库插入函数,如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事务而不合并它们,如果不是,那么最好的方法是实现这一点。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

取决于如何在方法中编写代码,但您可能希望查看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

答案 2 :(得分:1)

在设计良好的分布式体系结构(简化和数据库中心)中,您将拥有(至少)层和域实体层(其他层将依赖于主要层次)

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

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

对于每个域实体,我们会有一个单独的服务,例如,如果我们有Customer TableOrder table我们会有: CustomerEntityOrderEntity(域实体对象)
CustomerServiceOrderService(服务层对象)
CustomerDACustomerDA(数据访问层对象)

作为规则,任何DataAccess对象都将为其Domain实体执行Inset,Update,Delete,并且不会干扰其他实体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张伯伦将以自己的方式做到这一点

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