在Java中回滚“软”事务的方法

时间:2013-04-09 12:15:44

标签: java transactions rollback

当我说“软”事务时,我的意思是某些内容不涉及某些数据库中的持久性而只是逻辑对象修改。这就是故事。

普通的JAVA应用程序,没有框架,可能有很多线程。

  1. 对象 Ob ,在他的单独帖子中,启动 doSomething()。在doSomething()中,此对象成员和(可能)其他对象被修改。
  2. Ob的线程被某些事件处理程序中断。有人想要Ob来 doSomethingElse()而不是doSomething()!
  3. Ob完成doSomething()并检查他的线程是否被中断。如果是的话,我希望他:
    a)完全撤消( rollback )doSomething(),
    b)doSomethingElse()
  4. 无需跟踪doSomething()中的任何特定更改,也因为我可以为每个对象提供许多不同的doSomething方法。我没有使用特定的框架,我想保持它“轻松”,比如说。

    有没有办法实现这样的行为?
    非常感谢提前!

3 个答案:

答案 0 :(得分:4)

您可以查看Memento Pattern

  

memento模式是一种软件设计模式,可以将对象恢复到以前的状态(通过回滚撤消)。

答案 1 :(得分:2)

是的,这样的功能是可能的并且经常用于例如ORM框架或servlet容器。 ORM框架主要提供某种实体缓存,其中存储了预先填充的Java对象。必须将对这些对象的修改与数据库事务同步。某些servlet容器还提供对HTTP会话的事务访问。例如。请求期间的修改将应用于会话的副本,并且只有在请求成功并以其他方式丢弃时才会永久应用。

通常,此类功能基于在启动事务时制作状态的副本,在事务期间处理副本,并在提交事务时用修改后的副本替换永久状态,如果事务是,则分别丢弃副本回滚。您可能还需要其他功能来检查甚至禁止并发修改。

由于Java中没有“标准”方式来制作对象副本,因此您必须自己做一些工作,并且有几种可能的方法:

  • 实现Cloneable,但要确保克隆方法返回对象的深层副本而不是默认的浅层副本(出站引用只是“移动”到新对象而不是制作实际的副本引用对象)。
  • 使用序列化。如果您的对象是可序列化的,则可以序列化,例如到ByteArrayOutputStream并读取对象以获取副本。
  • 实施您自己的基于反射的复制功能。

答案 2 :(得分:0)

Java中没有内置工具来执行此操作。所以你必须手动完成这个。 主要是,这是关于复制受影响的对象状态并在回滚时恢复它们。

相关问题:

Transaction for POJOs