我必须编写一些方法来将值更改到数据库并在文件系统上进行一些操作。 所以我必须做出步序列:春季交易白衣几个操作和回滚
- 布尔
Updating
字段设置为true
到数据库中。它用于避免访问与此值链接的文件系统和数据库信息(例如一组汽车) - 对数据库进行一些操作。例如更改日期,名称,值或其他字段。这些更改会影响更多数据库表。
- 作任何改动文件系统和数据库
- 设置布尔
Updating
假
你可以想象我有管理的错误,并开始回退过程来恢复数据库和文件系统。 我对如何写我的方法有一些疑问。我有:
- 实体
- 扩展
JpaRepository
并具有方法名称查询创建与@Transactional
注释@Query
如果它们写入到数据库中的资料库界面(否则我recevied错误) - 服务接口
- 包含所有对数据库进行简单更改的方法的服务实现。这个类都被注解
@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
场是错在这里? 谢谢
我认为你不能保证_FILE RESTORE_阶段,写入文件时抛出异常,很有可能再次写入文件,恢复它的状态也会失败。 – minus
当然,我会尝试只更新一次,如果恢复失败我发送电子邮件并保持文件系统锁定,直到手动操作解决问题。 – luca