【问题标题】:Transaction between database and a memory task ?数据库和内存任务之间的事务?
【发布时间】:2011-09-02 12:38:28
【问题描述】:

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

我使用的是 EF 4.1,它只是为我提供了 SaveChanges 方法,它自己进行事务处理。只要 SaveChanges 不抛出异常,我就可以在内存上做一些任务。这是一个解决方案。但它破坏了应用程序的架构。因为 SaveChanges 在该任务之前没有调用。 Task 在调用时无法知道 SaveChanges 将来是成功还是失败。

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

如果是这样,我们该怎么做?

【问题讨论】:

    标签: c# .net transactions


    【解决方案1】:

    Juval Lowy 在 MSDN 中有一篇出色的文章,标题为“Volatile Resource Managers in .NET Bring Transactions to the Common Type”,解释了如何围绕内存类型创建事务包装器。

    在其核心,您想要实现ISinglePhaseNotification interface。一旦你为你想成为事务的一部分的内存类型实现了这个,你必须通过在Transaction class上调用EnlistVolatile method来注册它,以注册实例以通知事务。

    通常,您会通过查看静态 Transaction.Current property 是否不为空来调用 EnlistVolatile,如果不为空,则使用该值进行注册(例如,这是 System.Data.SqlClient namespace 中的类所做的以进行自我注册)。

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

    如果你不想经历上述,你也可以订阅TransactionCompleted event,根据Transaction property返回的Transaction的状态改变你的内存变量的状态。 987654330@ 已传递给事件处理程序。

    您可以通过Transaction 上的TransactionInformation property 获得TransactionInformation instanceTransactionInformation 类有一个 Status property,它从 TransactionStatus enumeration 返回一个值,指示事务的状态(已提交、已中止等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 2013-08-12
      相关资源
      最近更新 更多