C# – 业务层中事务的使用(SQLServer 2005 +,Oracle) – 很好的例子

我将使用3层架构构建服务,我真的很担心如何以事务处理方式处理操作。

我知道我有两个选择: IDbTransactionTransactionScope ……但我并没有真正决定去哪一个,尽管我做了很多研究。

我会选择TransactionScope,但我不想涉及DTC …而且我需要支持SQLServer2005和Oracle。 (我知道我需要一次只打开一个连接)

我希望看到两种情况下使用它们的良好示例/模式…良好的链接可以做得很好。

类似于BL类和DAL类的样子……还有如何在它们之间创建和传递事务/连接。

编辑1:我正在寻找一些实现这个(但两个选项):

 using(var scope = new TransactionScope()) { // transactional methods datalayer.InsertFoo(); datalayer.InsertBar(); scope.Complete(); } 

编辑2:由于丹尼斯为我提供了一个非常好的选择…我还在等待有人向我展示一个模型的好例子,它使用’ TransactionScope ‘在业务层和数据层之间进行交互

谢谢。

我在这种情况下目前使用的是多个存储库和多个UnitOfWork方法。 假设您有CustomerRepository和InvoiceRepository。 如果你需要这样做:

 customerRepository.Add(customer); invoiceRepository.Add(bill); 

并将这两个作为一个事务,然后我做的是创建存储库我给他们相同的UnitOfWork,如:

 IUnitOfWork uow = UnitOfWork.Start(); ICustomerRepository customerRepository = new CustomerRepository(uow); IInvoiceRepository invoiceRepository = new InvoiceRepository(uow); 

所以上面的陈述现在是:

 customerRepository.Add(customer); invoiceRepository.Add(bill); uow.Commit(); 

所有的魔力都在下面,取决于你用作数据技术的东西(ORM如NHibernate,或者可能是原始的ADO.NET–在大多数情况下不建议这样做)。

有关存储库模式和UnitOfWorks的一个很好的例子,请阅读本教程 ,但请注意,在其中您不能激活多个UnitOfWorks(实际上很少有应用程序需要它,因此没有真正的问题)。 此外,本教程使用NHibernate,所以如果您不熟悉ORM概念,我建议您加入它(如果您的时间表允许)。

还有一件事:你在这里也有更高级的模式,比如每次会话的会话等等,但这是高级的东西,我现在正在把头包裹起来,如果你想看看uNhAddIns项目(对于NHibernate也是如此) )

我会选择TransactionScope,因为它使用起来要简单得多,因为你不需要携带一个事务对象,或者将它传递给每个方法。 这是环境 。 这意味着,大多数时候,开发人员几乎可以忘记事务,编写很酷的面向业务的方法,然后,稍后,在事后需要的地方添加事务包装器(使用’using’)。 (听起来田园诗般的我知道,但几乎就是这样)。

与流行的看法相反,使用TransactionScope并不意味着MSDTC将参与其中,请参阅此处以获取对此的回顾:

避免不必要的升级到分布式事务

而且,如果你真的需要一个分布式交易,那么,你打算如何在没有MSDTC的情况下做到这一点? 再次使用TransactionScope有趣的是,如果需要,它会升级到MSDTC,而不会在代码中改变任何内容。

您可以通过实现在业务层中使用的瘦包装器来抽象这两种技术。 让我们说:

 using (IUnitOfWork unitOfWork = UnitOfWork.Start()) { // do something unitOfWork.Commit(); } 

然后,您可以使用仅打开数据库事务的实现。 如果需要涉及另一个事务系统,只需将工作单元实现切换为打开TransactionScope而不是简单数据库事务的实现。

UnitOfWork模式非常适合清晰的事务处理(除其他外)。 这是一些在重型应用中使用的模式的良好实现:

https://github.com/NikGovorov/Taijutsu/tree/master/Sources/Sources/Taijutsu-Infrastructure

虽然您必须为您选择的ORM(NH,EF,…)实现DataProvider,但它相当简单。

Interesting Posts