我想在数据库中做一些工作,然后在内存上做一些任务(比如改变一些对象的值),我想在同一个事务中组合这两个任务。
我正在使用EF 4.1,它只是提供了SaveChanges方法,它自己进行交易。简单来说,如果SaveChanges没有抛出异常,那么我可以在内存上做一些任务。这是一个解决方案。但它破坏了应用程序的架构。因为SaveChanges在该任务之前没有调用。任务无法知道SaveChanges在调用时将来会成功还是失败。
是否可以在数据库和内存任务之间进行任何交易?
如果是这样我们怎么做呢?
答案 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
instance。 TransactionInformation
类有TransactionInformation
property,它返回Status
property中的值,表示事务的状态(已提交,已中止等)。