0

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

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

  1. Object Ob,在他的单独线程中,开始doSomething()。在 doSomething() 中,此对象成员和(可能)其他对象被修改。
  2. Ob 的线程被某个事件处理程序中断。有人想让 Ob 做doSomethingElse()而不是 doSomething()!
  3. Ob 完成 doSomething() 并检查他的线程是否被中断。如果是,我希望他:
    a)完全撤消(回滚)doSomething(),
    b)doSomethingElse()

无需跟踪 doSomething() 中所做的任何特定更改,也因为我可以为每个对象设置许多不同的 doSomething 方法。我没有使用特定的框架,我想让它保持“轻量级”,比如说。

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

4

3 回答 3

4

你可以看看Memento Pattern

备忘录模式是一种软件设计模式,它提供了将对象恢复到其先前状态(通过回滚撤消)的能力。

于 2013-04-09T12:29:19.890 回答
2

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

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

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

  • 实现Cloneable,但确保 clone 方法返回对象的深层副本而不是默认的浅层副本(出站引用只是“移动”到新对象,而不是制作被引用对象的真实副本)。
  • 使用序列化。如果您的对象是可序列化的,您可以将例如序列化为 aByteArrayOutputStream并读回对象以获取副本。
  • 实现您自己的基于反射的复制功能。
于 2013-04-09T12:33:04.230 回答
0

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

相关问题:

POJO 的事务

于 2013-04-09T12:22:56.833 回答