我知道事务可以用来实现原子性。
就像如果methodOne()
methodTwo()
methodThree()
被合并到一个事务中一样,如果任何方法失败,整个操作都会回滚。回滚将导致数据库级别的回滚,因此数据库将进入一个状态,就像它在事务之前一样。
但是,如果这些方法对状态变量或静态变量进行了更改或写入文件系统中的某些文件怎么办?我的理解是,“回滚”不适用于此类非数据库修改,并且这些更改不会撤消。我的理解对吗?
我知道事务可以用来实现原子性。
就像如果methodOne()
methodTwo()
methodThree()
被合并到一个事务中一样,如果任何方法失败,整个操作都会回滚。回滚将导致数据库级别的回滚,因此数据库将进入一个状态,就像它在事务之前一样。
但是,如果这些方法对状态变量或静态变量进行了更改或写入文件系统中的某些文件怎么办?我的理解是,“回滚”不适用于此类非数据库修改,并且这些更改不会撤消。我的理解对吗?
EJB 3 中的事务(原子性属性)仅适用于数据库操作——对吗?
不你不是。事务适用于事务资源,Java EE 规范识别三种类型的事务资源:JDBC 数据库、JMS 目标和“通过 JCA 访问的其他事务服务”。
但是,如果这些方法对状态变量或静态变量进行了更改或写入文件系统中的某些文件怎么办?
这些不是事务性资源(除非您稍后通过 JCA 连接器写入文件系统)。
文件系统资源不是事务性的。因此,您将不得不回滚您的更改。或者您将不得不查看容器提供的文件系统资源适配器。
该上下文中的事务是指数据库事务。如果您放置 Java 代码,这些代码会更改变量或向文件系统生成输出,那么您就没有很好地使用它。您应该启动一个事务并对数据库进行操作。
但是,如果您的 DBMS 对文件系统进行了更改(例如,通过存储过程),那么您必须检查该 DBMS 的文档。
因此,请阅读您的代码,如果您在“START TRANSACTION”命令之后有代码,则必须对其进行审核。