java - Spring事务有几个操作和回滚

标签 java mysql spring transactions rollback

我必须编写一些方法来将值更改为数据库并对文件系统进行一些操作。 所以我必须执行以下步骤:

  1. 将数据库中的 boolean Updating字段设置为true。它用于避免访问与该值链接的文件系统和数据库信息(例如车队)
  2. 对数据库进行一些操作。例如更改日期、名称、值或其他字段。这些更改会影响更多数据库表。
  3. 更改文件系统和数据库
  4. 将 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/

相关文章:

java - iText 列宽错误

mysql - 未登录的用户可以看到由 Carrierwave 保存的文件

java - 即使一个 bean 在运行时出现错误,也确保 Spring 应用程序的其余部分运行

java - 搜索/过滤器的Spring REST API设计

java - Spring 将自定义 bean Autowiring 到它自己的类中

java - 如何使用 Selenium 获取 WebElement 文本

java - 使用较新版本的 Java,我的一些应用程序快捷方式被 MacOS 快捷方式覆盖

java - 尝试将 JpaRepository 注入(inject) AWS Lambda 时没有合格的 bean

mysql - 为什么仪表板菜单在 mysql 工作台中被禁用

mysql查询无法识别字符串