相关疑难解决方法(0)

春天 - @Transactional - 后台会发生什么?

我想知道当你用方法注释方法时实际发生了@Transactional什么?当然,我知道Spring会将该方法包装在Transaction中.

但是,我有以下疑问:

  1. 我听说Spring创建了一个代理类?有人可以更深入地解释这一点.实际存在于该代理类中的是什么?实际班级会发生什么?我怎样才能看到Spring创建的代理类
  2. 我还在Spring文档中读到:

注意:由于此机制基于代理,因此只会拦截通过代理进入的"外部"方法调用.这意味着'自调用',即目标对象中调用目标对象的其他方法的方法,即使被调用的方法被标记,也不会在运行时导致实际的事务@Transactional!

资料来源:http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html

为什么只有外部方法调用才会在Transaction下而不是自调用方法?

java spring transactional spring-jdbc spring-aop

313
推荐指数
6
解决办法
15万
查看次数

@Transactional注释可以与saveAndFlush一起使用吗?

我有以下实现。

@Transactional
public void saveAndGenerateResult(Data data) {
    saveDataInTableA(data.someAmountForA);
    saveDataInTableB(data.someAmountForB);
    callAnAggregatedFunction(data);
}

public void saveDataInTableA(DataA a) {
    tableARepository.saveAndFlush(a);
}

public void saveDataInTableA(DataB b) {
    tableBRepository.saveAndFlush(b);
}

public void callAnAggregatedFunction() {
    // Do something based on the data saved from the beginning in Table A and Table B
}
Run Code Online (Sandbox Code Playgroud)

重要的saveAndFlush是使数据立即可供callAnAggregatedFunction函数使用,以获取汇总结果并将其保存到另一个表中。这就是为什么我不使用save据我所知不会立即将事务刷新到数据库中的函数的原因。

但是,我@Transactional在函数上使用了注释saveAndGenerateResult,因为在发生任何故障的情况下,我想回退在该函数中完成的数据库事务,通常通过@Transactional在方法上进行注释可以确保发生任何故障。

在这种特定情况下会发生什么情况?我正在使用saveAndFlush哪种方法将数据立即刷新到数据库表中,并且如果最后一个函数(即callAnAggregatedFunction)无法将数据写入表中,将回退表A和表B中的先前写入操作吗?

java hibernate transactional spring-data-jpa spring-boot

7
推荐指数
1
解决办法
3889
查看次数