我的想法已经不多了......
我的弹簧启动应用程序在indellij中运行并且 gradle idea插件已应用( apply plugin:'idea')时表现良好。 一旦我从 build.gradle 中删除插件,它的行为与使用 java -jar app.jar 执行的应用程序类似 - 存在微妙但重要的区别,下面的描述。
我有以下情况,当前tx由于某些异常而失败,tx被标记为仅回滚,异常被捕获并且其处理包括使用 TransactionSynchronizationManager.registerSynchronization (新tx)。
代码在intellij中使用idea插件工作正常,当我删除插件声明或使用 java -jar 注册进程(post tx failure task)运行spring boot jar时失败,异常:
Caused by: java.lang.IllegalStateException: Transaction synchronization is not active
at org.springframework.transaction.support.TransactionSynchronizationManager.registerSynchronization(TransactionSynchronizationManager.java:291) ~[spring-tx-4.3.10.RELEASE.jar!/:4.3.10.RELEASE]
顺便说一下,如果重要的话,代码就在kotlin中。 有什么想法吗?
更新
我认为存在某种竞争条件,因为在调试模式下,即使没有想法插件,应用也会按预期运行(注册过程成功)。
答案 0 :(得分:0)
我解决了我的问题,根本原因是非常令人惊讶的......
显然正确处理自定义Spring注释存在问题。 应该打开新事务的方法没有使用标准的@Transactional注释进行注释,而是使用自定义的特定于应用程序的注释(带有自定义tx设置的@Transactional)。调试会话显示新的tx没有打开。而已!内联自定义注释几乎解决了一个问题。 我检测到的另一个缺陷是一个不是 open 的函数,非常奇怪,因为函数不是事务入口点(som进一步调用)。
Kotlin编译器错误? 无论如何,经验教训 - 注意自定义注释行为;刷新有关最终/开放规则的知识。