【发布时间】:2021-12-30 12:07:58
【问题描述】:
预期行为
当使用 @Transactional 注释时,我希望数据库操作属于事务范围,如果任何步骤失败,则应该进行回滚。
实际行为
在当前场景下,即使有@Transactional注解,万一操作失败,回滚也不做,造成不一致
复制步骤
- 在您的数据库中应用DDL 脚本
- 对数据库执行如下操作创建账户插入ACCOUNTS(ACCOUNT_NUMBER,BALANCE)值('0000001',0.0)
- 运行应用程序并执行以下 curl:
curl --location --request POST 'http://localhost:8080/deposit' \
--header 'Content-Type: application/json' \
--data-raw '{
"accountNumber": "0000001",
"amount": 999.20
}'
您将看到抛出 DataIntegrityViolationException,这是因为历史记录表有一个定义不明确的字段,其小数金额 (2,2) 并且存款金额不匹配,在这种情况下,我预计账户余额更新为被反转,但是这不会发生。
我看到已经关闭了关于问题 #651 的问题,但 micronaut 数据文档表明此功能有效,因为在第 10 项中有以下文本:
In addition to this dependency you will need either spring-orm (for Hibernate) or spring-jdbc (for JDBC) on your classpath to enable support for Spring-based transaction management:
你能澄清一下吗?我们计划将一些应用程序从 spring 迁移到 micronaut,它们都是使用 jdbctemplate 开发的,所以如果我能做到这一点,过渡会容易得多,也许我在文档中丢失了一些东西,或者我弄错了在某些时候,感谢您的出色工作。
环境信息
操作系统:Windows 11 JDK:祖鲁 JDK 11.0.12 Maven 3.6.3 Micronaut 2.5.4
示例应用程序
https://github.com/viniciusxyz/micronaut-transaction-failed
版本
2.5.4
【问题讨论】:
标签: java transactions jdbctemplate micronaut