当我说“软”事务时,我的意思是不涉及某些数据库的持久性,而只是逻辑对象的修改。这是故事。
普通的JAVA应用程序,没有框架,可能有很多线程。
对象Ob在其单独的线程中启动doSomething()。在doSomething()中,将修改此对象成员和(可能)其他对象。
Ob的线程被某些事件处理程序中断。有人希望Ob做doSomethingElse()而不是doSomething()!
Ob完成doSomething()并检查他的线程是否被中断。如果是,我希望他:
a)完全撤消(还原)doSomething(),
b)doSomethingElse()
不必跟踪doSomething()中所做的任何特定更改,这也是因为我可以为每个对象使用许多不同的doSomething方法。我没有使用任何特定的框架,所以我想保持它的“轻便”。
有没有办法实现这种行为?
在此先多谢!
最佳答案
是的,这样的功能是可能的,并且经常用于例如ORM框架或servlet容器中。 ORM框架主要提供某种类型的实体缓存,其中存储了预先填充的Java对象。对这些对象的修改必须与数据库事务同步。一些servlet容器还提供对HTTP会话的事务访问。例如。请求期间的修改将应用于会话的副本,并且仅在请求成功后才永久应用,否则将被丢弃。
通常,这样的功能基于在开始交易时制作状态的副本,在交易期间处理副本并在提交交易时用修改后的副本替换永久状态,如果交易回滚则分别丢弃副本。您可能还需要其他功能来检查甚至禁止并发修改。
由于Java中没有创建对象副本的“标准”方法,因此您必须自己做一些工作,并且有几种可能的方法:
实现Cloneable
,但是请确保clone方法返回对象的深层副本,而不是默认的浅层副本(出站引用只是“移动”到新对象,而不是真正创建被引用对象的副本)。
使用序列化。如果您的对象可序列化,则可以序列化,例如到ByteArrayOutputStream
并读回该对象以获得副本。
实现您自己的基于反射的复制功能。
关于java - 回滚Java中“软”事务的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15901631/