数据库和内存任务之间的事务?

时间:2011-09-02 12:38:28

标签: c# .net transactions

我想在数据库中做一些工作,然后在内存上做一些任务(比如改变一些对象的值),我想在同一个事务中组合这两个任务。

我正在使用EF 4.1,它只是提供了SaveChanges方法,它自己进行交易。简单来说,如果SaveChanges没有抛出异常,那么我可以在内存上做一些任务。这是一个解决方案。但它破坏了应用程序的架构。因为SaveChanges在该任务之前没有调用。任务无法知道SaveChanges在调用时将来会成功还是失败。

是否可以在数据库和内存任务之间进行任何交易?

如果是这样我们怎么做呢?

1 个答案:

答案 0 :(得分:3)

Juval Lowy在MSDN上发表了一篇名为“Volatile Resource Managers in .NET Bring Transactions to the Common Type”的优秀文章,解释了如何围绕内存类型创建事务包装。

您的核心是,您希望实施ISinglePhaseNotification interface。为内存类型实现此操作后,您希望成为事务的一部分,您必须通过调用EnlistVolatile method上的Transaction class来注册它,以便在事务上注册实例以进行通知。

通常,您可以通过查看静态Transaction.Current property是否为空来调用EnlistVolatile,如果不是,则注册(例如,这是System.Data.SqlClient namespace为了自我注册而这样做。

但是,一旦您知道Transaction到位后(例如,在创建TransactionScope之后),您就可以在任何地方登记您的实例。

如果您不想完成上述操作,还可以订阅TransactionCompleted event并更改内存变量的状态,具体取决于通过{{返回的Transaction的状态。传递给事件处理程序的Transaction property上的3}}。

您可以通过Transaction上的TransactionEventArgs获得TransactionInformation instanceTransactionInformation类有TransactionInformation property,它返回Status property中的值,表示事务的状态(已提交,已中止等)。