我必须编写一些方法来将值更改为数据库并对文件系统进行一些操作。 所以我必须执行以下步骤:
- 将数据库中的 boolean
Updating
字段设置为true
。它用于避免访问与该值链接的文件系统和数据库信息(例如车队) - 对数据库进行一些操作。例如更改日期、名称、值或其他字段。这些更改会影响更多数据库表。
- 更改文件系统和数据库
- 将 boolean 值
更新
设置为 false
正如您所想象的,我必须管理错误并启动回滚过程来恢复数据库和文件系统。 我对如何编写我的方法有些疑问。我有:
- 实体
- 存储库接口(interface),它扩展了
JpaRepository
,并且可以从方法名称创建查询,并且如果它们写入数据库(则用@Transactional
注释)(否则我收到错误) - 服务接口(interface)
- 包含对数据库进行简单更改的所有方法的服务实现。该类用
@Transactional
进行注释
从其他类中,我调用服务方法来使用数据库,但是如果我调用其中一些方法,我会将每个值写入数据库,这样就不可能抛出回滚,或者我错了? 步骤 1 必须立即写入数据库,而不是其他更改应该使用 @Transactional 属性,但只需将 @Transactional 添加到我的方法就足够了?对于文件系统回滚,我创建所有子文件夹的备份并在出现错误时恢复它们。 例如:
@Transactional(rollbackFor=FileSystemException.class)
private void changeDisplacement(int idApplication, int idDisplacement){
applicationServices.setUpdating(true); //this has be to write immediatly into database so that the other methods can stop using this application
Application application = applicationServices.getId(idApplication);
application.setDisplacement(displacementServices.getId(idDisplacement));
//OTHER OPERATIONS ON DIFFERENT TABLES
//OPERATIONS ON FILE SYSTEM CATCHING ALL EXCEPTION WITH TRY-CATCH AND IN THE CATCH RESTORE FILESYSTEM AND THROW FileSystemException to start database rollback
//In the finally clause use applicationServices.setUpdating(false)
}
它可以按照这个逻辑工作吗?或者这里的@Transactional
字段是错误的?
谢谢
最佳答案
@Transactional
在这里就可以了。唯一的事情是您需要将 applicationServices.setUpdating
的传播设置为 REQUIRES_NEW
以便单独提交:
public class ApplicationServices {
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void setUpdating(boolean b) {
// update DB here
}
}
在出现异常的情况下,只要您在finally block 中调用setUpdating
,它仍然会更新数据库。
关于java - Spring事务有几个操作和回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43203703/