代码之家  ›  专栏  ›  技术社区  ›  MicSim

对象级事务管理模式

  •  5
  • MicSim  · 技术社区  · 15 年前

    我试图找出在对象级别(而不是数据库级别)处理事务的最佳方法。简短示例:4个对象A、B、C和D。A启动一个事务并调用B和C中的方法。在此事务中,C也在调用D。被调用的方法不应该总是参与此事务,但也可以自己调用。

    我没有真正找到什么,所以我想到了这个:使用TransactionContext,在这里可以注册TransactionListeners。如果事务是使用TransactionContext启动的,那么它会将正在运行的事务注入到每个注册的侦听器中,而这些侦听器又会使用正在运行的事务,或者如果需要,elsewise会自己启动一个事务。这样,我就可以自由地决定是否需要一个对象参与我的事务。

    当有如上所述的对象调用链时,问题就来了。当启动事务时,我只知道B和C必须参与事务,所以我将它们添加到TransactionContext中。但是D呢?我真的不想把TransactionContext传递给B和C。

    我希望您能对我的方法提供一些意见,并向我推荐一些经过验证的模式(甚至更好)。

    4 回复  |  直到 15 年前
        1
  •  2
  •   S.Lott    15 年前

    “我真的不想将TransactionContext传递给B和C。”

    为什么不呢?它们参与并委托给其他对象。

    任何一个

    • 每个人都需要注册。这意味着你必须授权注册。 A B C . 每个人可能(也可能不)有更多的被授权人进行注册。使用“RegisterYourSelf和YourDelegates”方法实现这一点相对简单。

    • 这使得函数定义稍微复杂一些。对于Java,可以使用重载命名来拥有两个具有不同签名的方法函数。

      对于Python来说,这不是问题;上下文是可选参数。

        2
  •  1
  •   cletus    15 年前

    Spring framework (最初用于Java,但现在也有.Net版本)可以做到这一点。方法标记为:

    • 需要一个事务(如果还没有事务,则启动一个事务);
    • 需要新事务(始终创建新事务);

    退房 Spring's transaction management

        3
  •  0
  •   Daniel Fanjul    15 年前

    我建议: Prevayler

    Prevayler is an object persistence library for Java. It is an implementation of the
    System Prevalence architectural style, in which data is kept hot in Memory with
    changes journaled for system recovery.
    
    Prevayler ' s architecture is illustrated in the diagram shown there. Prevayler [1]
    serves as a transactional barrier for the business objects [2] of your application,
    held in Memory. You encapsulate all modifications of your business objects into
    instances of the Transaction interface [3], much like a " command " pattern
    (though different from a command in some details of the pattern). Whenever 
    you ask Prevayler to execute a transaction on your business objects [4], Prevayler
    first writes the transaction object to a journal [5] so that data is not lost if your
    system crashes. Prevayler can also write a snapshot of your entire business object
    graph [6] as often as you wish. Prevayler uses the latest snapshot together with
    the journals to automatically recover your business objects from disk [7] on
    application startup by restoring the snapshot and then re-executing every
    transaction that was originally executed after that snapshot was taken.
    

    当然,您可以禁用持久存储,而只使用内存中的存储。

        4
  •  0
  •   Sergey Golovchenko    15 年前

    this paper 由安德烈·亚历山德雷斯库和佩特罗·马吉宁(Petru Marginean)执导,该片介绍了斯考普后卫彭定康(ScopeGuard patten)。这是一个优雅且非常健壮的解决方案,专门用于在出现异常时管理事务。