如何将 Micronaut 与 Spring Jdbctemplate 和事务一起使用?

How to use Micronaut with Spring Jdbctemplate and transactions?

预期行为

当使用 @Transactional 注释时,我希望数据库操作属于事务范围,如果任何步骤失败,应该进行回滚。

实际行为

目前的场景,即使有@Transactional注解,一旦操作失败,也不会回滚,造成不一致

重现步骤

  1. 在您的数据库中应用 DDL 脚本
  2. 在数据库上执行以下操作创建一个账户insert into ACCOUNTS (ACCOUNT_NUMBER, BALANCE) values('0000001',0.0)
  3. 运行 应用程序并执行以下 curl:
curl --location --request POST 'http://localhost:8080/deposit' \
--header 'Content-Type: application/json' \
--data-raw '{
  "accountNumber": "0000001",
  "amount": 999.20
}'

您将看到抛出 DataIntegrityViolationException,这是因为历史记录 table 有一个定义不正确的字段,其小数金额 (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 开发的,所以如果我能让这一点生效,转换会容易得多,也许我在文档中丢失了一些东西或者我'我在某些时候弄错了,感谢您的出色工作。

环境信息

操作系统:Windows11 JDK:祖鲁语 JDK 11.0.12 行家 3.6.3 Micronaut 2.5.4

示例应用程序

https://github.com/viniciusxyz/micronaut-transaction-failed

版本

2.5.4

我解决了问题。

只替换依赖:

        <dependency>
            <groupId>io.micronaut.data</groupId>
            <artifactId>micronaut-data-spring</artifactId>
            <scope>compile</scope>
        </dependency>

每:

            <dependency>
                <groupId>io.micronaut.spring</groupId>
                <artifactId>micronaut-spring</artifactId>
                <scope>compile</scope>
            </dependency>