未对@Transactional Annotation执行回滚[重复]

2024-06-24

我正在尝试创建一个用于转账的 API 即取款和存款。 我使用@Transactional Annotation 执行事务。 但有一些标准,即如果银行帐号不存在,则应通过运行时异常。 我将附上其中的代码。现在,当调用 TransferBalanceMethod 时,如果存款人银行账户不存在,则提取的金额也应该回滚。 但这并没有发生。是指当A账户向B账户转账1000卢比时,如果B账户的存款出现异常,则A账户的提款也应该被提取。 我也尝试了 @Transactional 注释以及 Exception 类的 rollbackFor 属性 我也尝试为存款和取款方法添加 @Transaction 注释,但我们使用相同的交易,因为我们使用传播必需**

Model Class//This is the Model Class
//All Imports

@Entity
public class BankAccount {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "bankAccountNumber", nullable = false,unique = true)
    @NotNull
    @Size(min = 5, message = "Bank account number should be greater than 5 characters")
    private String bankAccountNumber;

    @NotNull
    @Column(name = "balance", nullable = false)
    @Min(1000)
    private Long balance;

//Getter Setter and Constructor

**Controller File**//This is the Controller Class

//All imports and other stuff such as @RestController, @Autowired   

@GetMapping("/bankaccount/transfer")
public void transferBalance(@RequestParam("bankAccountNo1") String bankAccountNo1, @RequestParam("bankAccountNo2") String bankAccountNo2,
            @RequestParam("balance") Long balance) throws RuntimeException
    {
        bankService.transferBalance(bankAccountNo1,bankAccountNo2, balance);
    }

}

**Service File:-**//This is Service Layer
//All imports

@Service
public class BankService {

    @Autowired
    private BankRepository bankRepository;

    @Autowired
    private ModelMapper modelMapper;

    public List<BankAccountDTO> getAllBankAccount() {
        List<BankAccountDTO> bankAccountDTO = new ArrayList<BankAccountDTO>();
        List<BankAccount> bankAccount = bankRepository.findAll();
        for (BankAccount b : bankAccount) {
            bankAccountDTO.add(modelMapper.map(b, BankAccountDTO.class));
        }
        return bankAccountDTO;
    }

    public ResponseEntity<?> getIndividualBankAccount(String bankAccountNumber) {
        BankAccount bankAccount = bankRepository.findByBankAccountNumber(bankAccountNumber);
        if (bankAccount == null) {
            return new ResponseEntity<>("Account not found", HttpStatus.BAD_REQUEST);
        } else {
            return new ResponseEntity<>(
                    modelMapper.map(bankRepository.findByBankAccountNumber(bankAccountNumber), BankAccountDTO.class),
                    HttpStatus.OK);
        }
    }

    public Object addBankAccount(BankAccountDTO bankAccountDTO) {
        return bankRepository.save(modelMapper.map(bankAccountDTO, BankAccount.class));
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void depositBalance(String bankAccountNumber, Long balance) throws RuntimeException {
        BankAccount bankAccNo = bankRepository.findByBankAccountNumber(bankAccountNumber);

        if (bankAccNo == null) {
            throw new RuntimeException("Bank Accout Number is not found : " + bankAccountNumber);
        } else {
            if (balance <= 0) {
                throw new RuntimeException("Please deposit appropriate balance");
            } else {
                Long amount = bankAccNo.getBalance() + balance;
                bankAccNo.setBalance(amount);
                bankRepository.save(bankAccNo);
            }
        }

    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void withdrawBalance(String bankAccountNumber, Long balance) throws RuntimeException {
        BankAccount bankAccNo = bankRepository.findByBankAccountNumber(bankAccountNumber);
        if (bankAccNo == null) {
            throw new RuntimeException("Bank Account not found :" + bankAccountNumber);
        } else {
            if (balance <= 0) {
                throw new RuntimeException("Please withdraw appropriate balance");
            } else {
                Long amount = bankAccNo.getBalance() - balance;
                if (amount < 1000) {
                    throw new RuntimeException("Sorry Cannot withdraw.Your minimum balance should be thousand rupees!");
                } else {
                    bankAccNo.setBalance(amount);
                    bankRepository.save(bankAccNo);
                }
            }
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = RuntimeException.class)
    public void transferBalance(String bankAccountNo1, String bankAccountNo2, Long balance) throws RuntimeException {
        try {
            withdrawBalance(bankAccountNo1, balance);
            depositBalance(bankAccountNo2, balance);

        } catch (RuntimeException e) {
            throw e;
        }

    }

}

只有运行时异常才会在 Spring 事务注释中触发回滚操作,如果您使用自定义注释,您需要确保您要么从 RuntimeException 扩展,要么向您的事务添加特定的回滚子句,以便它在该特定的情况下回滚例外。

也许这个答案对你有用:Spring事务:异常或Throwable回滚 https://stackoverflow.com/questions/21188239/spring-transaction-rollback-on-exception-or-throwable

还可以在这里查看 spring 的官方事务文档:https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未对@Transactional Annotation执行回滚[重复] 的相关文章

随机推荐

  • ASP.NET Core 中的自定义脚手架模板

    现在我知道了如何在 ASP NET Core MVC 中启用脚手架 请参阅在 ASP NET Core 中查看脚手架模板 https stackoverflow com questions 38108163 view scaffold te
  • C# 匿名类型

    据我所知 匿名类型没有自己的预定义类型 类型由编译器在编译时分配给它 并且在编译时分配的类型的详细信息在代码级别无法得知 这些细节是 CLR 本身已知的 我听说 CLR 中的这些匿名类型被视为仅是引用类型 所以我的问题是 在编译时是否会创建
  • React-native-maps 限制平移区域

    有没有办法将地图限制在特定区域 以便平移和缩放包含在该区域内 而外部的所有内容都被锁定 我想限制用户可以在地图上看到的区域 我通过react native maps使用谷歌地图https github com react community
  • Matlab中皮尔逊系数和协方差的计算

    我想计算皮尔逊相关系数 http en wikipedia org wiki Pearson product moment correlation coefficient在Matlab中 不使用Matlab的corr功能 简单地说 我有两个
  • ckeditor 验证空格

    我如何在 ckeditor 上实现验证以防止用户仅添加空格 今天内的任何答复将不胜感激 以下是迄今为止我尝试进行的验证 Save note from ckeditor input save note click function var n
  • django默认身份验证表单显示用户名而不是电子邮件

    我用 django 实现了我自己的用户登录表单 如下所示 from django contrib auth forms import AuthenticationForm class CustomUserLoginForm Authenti
  • Java 如何知道如何迭代数组

    String strs new String 1 2 6 for String s strs System out println s 这是一个关于java内部的问题 在上面的代码示例中 foreach 循环如何计算出数组的长度 数组实际上
  • 如何配置“git diff”以使用 emacs diff [重复]

    这个问题在这里已经有答案了 是否可以配置 git diff 以使用 emacs diff 如果是的话 你能告诉我怎么做吗 谢谢 看这个问题 如何使用视觉差异程序查看 git diff 输出 https stackoverflow com q
  • Cloud Function 会影响 Firebase 存储带宽使用吗?

    I am trying to figure out why firebase storage usage is far above my expectation 我的 Firebase 存储中只有很少的照片文件 只有大约 75 张照片 每张
  • JMSSerializer + 表单/数组

    我是 SF2 社区的新手 所以请放轻松 我遇到了 JMSSerializerBundle 和表单 数组的问题 我花了两天时间尝试自己解决这个问题 但没有成功 我决定将其发布到小组中 我正在构建一个简单的测试应用程序 它可以让我了解这些东西是
  • Spring WebSockets XML 配置不提供brokerMessagingTemplate

    我正在尝试使用 STOMP 将 WebSockets 支持添加到使用 XML 配置的 Spring MVC 应用程序中 到目前为止 一切进展顺利 我已经成功让 WebSockets 服务器进行监听 并且 stomp js 可以连接到它并发送
  • React PHP 获取 POST 数据

    我试图在 ReactPHP Web 服务器上运行一个简单的 Web 应用程序 但我不知道从哪里获取来自 HTML 表单的 POST 数据 服务器定义为 include vendor autoload php register shutdow
  • 如何避免捕获变量?

    我有问题 foreach var category in categories foreach var word in words var waitCallback new WaitCallback state gt DoSomething
  • 在 ggplot 中编辑图例标签

    我有一个如下所示的数据框 data median min max no of threads 2 33 2 10 6 85 1 2 43 2 14 3 41 2 2 39 2 13 7 90 3 2 74 2 10 8 30 4 2 53
  • Android 模拟器无法运行从 eclipse 启动的应用程序

    我遵循了 Google Android 开发人员指南中的 Hello World 示例 当我尝试在 SDK 模拟器中运行应用程序时 没有任何反应 模拟器启动得很好 但之后什么也没有发生 我什至在应用程序托盘中看不到该应用程序 我正在使用安装
  • 将焦点设置在屏幕顶部 jquery

    我有一个包含多个选项卡的页面 我使用 jquery 根据 href 单击显示和隐藏它们 每当我单击 a href 时 页面就会向下滚动 我正在尝试将焦点设置在页面顶部 这是我在 Jquery 中的第一个项目 我尝试了以下但仍然不起作用 滚动
  • cx_Oracle 和数据源范例

    有一个 Java 范例用于在 Java 中实现数据库访问DataSource 该对象围绕数据库连接的创建创建了一个有用的抽象 这DataSource对象保留数据库配置 但只会根据请求创建数据库连接 这允许您将所有数据库配置和初始化代码保留在
  • Flink Kafka Producer 中的 Exactly-once 语义

    我正在尝试使用 Kafka Source 和 Sink 测试 Flink 的一次性语义 运行 flink 应用程序 只需将消息从一个主题传输到另一个主题 并行度 1 检查点间隔 20 秒 使用 Python 脚本每 2 秒生成递增整数的消息
  • 在 R 中创建矩阵的有效方法

    我正在尝试从向量创建这样的矩阵 vec c 2 5 9 gt A 1 2 3 4 1 2 0 0 0 2 5 3 0 0 3 9 7 4 0 实际上 第一列始终是向量元素 第二列从 0 开始 然后是 5 2 3 然后第二列的第三个元素是 9
  • 未对@Transactional Annotation执行回滚[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个用于转账的 API 即取款和存款 我使用 Transactional Annotation 执行事务 但有一些标准 即如果银行帐号不存在 则应通过运行时异常 我将附上其中的代码 现在 当调用 T