假设您从一个有@Transactional个值的服务类公共方法开始,它调用另一个也有@Transaction个值的服务类公共方法,依此类推.我想知道:

  1. 如果我只需要一个事务来处理所有事务,并且如果某个事务失败,我希望回滚所有的更改,那么我可以通过在第一个方法中只有1 @Transactional个事务来实现这一点.
  2. 向调用链下游的每个服务类方法添加@Transactional个方法是不必要的,并且对上面的用例的性能不利吗?
  3. 有没有这样的例子,当你想把@Transactional加到调用链的每一个方法上,以达到不同的效果?

推荐答案

如果我只需要一个事务来处理所有事情,并且如果某个操作失败,我希望回滚所有的更改,那么我可以通过在第一个方法中使用1@Transaction来实现这一点.

是.如果在@Transactional方法的堆栈中调用的任何较低的方法抛出未判断的异常,则所有操作都会回滚,并且不会在数据库中提交任何更改.这假设默认为Propagation REQUIRED.

向调用链下游的每个服务类方法添加@Transaction是不必要的,并且对上面的用例的性能不利吗?

要实现上面描述的事情,这是不必要的,尽管它确实不会增加任何开销.为简单起见,我建议将@Transactional个注释放在同一层上.在开发团队中找到一个共识,尽管在REST控制器调用的服务层中定义权限是很常见的.也有一些例外,例如,将@Transactional(propagation = REQUIRES_NEW)放在需要这样一个控件的较深层中是很常见的,嵌套事务不会影响外层事务,尽管它还取决于应用程序的分层方式.您可能还希望将注释放置到较低层,这些较低层由无法访问较高层的应用程序的不同部分调用.

当您想要向调用链下游的每个方法添加@Transaction以实现不同的结果时,有没有什么例子?

我不一定要注释every个方法,但我更愿意考虑我在上面描述的用例.

Java相关问答推荐

将偶数元素移动到数组的前面,同时保持相对顺序

@从类文件中删除JsonProperty—Java

为什么Java的代码工作(if condition内部的实例)

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

蒙蒂霍尔比赛结果不正确

JPanel透支重叠的JComcoBox

带错误BER验证的itext8签名返回pdf

有效的公式或值列表必须少于或等于255个字符

在处理2个映射表时,没有更多的数据可从套接字读取

来自外部模块的方面(对于Java+Gradle项目)不起作用

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

有没有办法知道在合并中执行了什么操作?

如何在Record Java中使用isRecord()和RecordComponent[]?

我的代码是线程安全的吗?[Java、CAS、转账]

在应用程序运行时更改LookAndFeel

H2数据库仅支持%1个结果集?

在数组中查找素数时出现逻辑错误

ExecutorService:如果我向Executor提交了太多任务,会发生什么?

在数组列表中找到对象后,未从数组中删除对象