模块化编程是正确的方法,但它有时会导致需要额外努力和研究的问题。我有三个数据库插入函数,如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事务而不合并它们,如果不是,那么最好的方法是实现这一点。
答案 0 :(得分:5)
只需将cn
和sqlTransaction
传递给函数,然后让函数使用传入的参数,而不是打开自己的连接。
答案 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 Table
和Order table
我们会有:
CustomerEntity
和OrderEntity
(域实体对象)
CustomerService
和OrderService
(服务层对象)
CustomerDA
和CustomerDA
(数据访问层对象)
作为规则,任何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的一个很好的示例
希望对你有所帮助。