Дже*_*ган 12 java spring spring-data spring-data-jpa spring-boot
关于 @Transactional 在 @Async 中工作的问题
\n这是示例的代码草图:
\n@Async\n@Transactional\n public void data(List<Pass> pass) {\n //code\n for(City city : city) {\n for(Dep dep: city.getDeps()) {\n //code\n setXor(user, xor);\n //code\n }\n }\n }\n\n\n@Transactional\npublic void setXor(User user, Xor xor) {\n //code\n user.setXor(xor);\n }\nRun Code Online (Sandbox Code Playgroud)\n问题是,这将如何工作,@Transactional是否从data方法扩展到setXor方法(如果你在data方法上放置注释,那么也许你不需要将它放在setXor上?并且它会自动切换到此方法)
\n还有一个关于@Async的问题,setXor会与Async一起在新线程上工作吗?就是会有一个主线程,新建一个,其中包括data方法,并且由于data方法调用了另一个方法,所以会和data方法在同一个线程上执行,不会有第三个线程。或者反之亦然,setXor 方法在主线程中执行?
\nTri*_*riS 14
根据 Spring 事务文档
事务范围内的所有代码都在该事务中运行。但是,如果事务方法在事务上下文已存在时运行,您可以指定该行为。例如,代码可以在现有事务中继续运行(常见情况),或者可以暂停现有事务并创建新事务。
@Transactional通常与由 管理的线程绑定事务一起使用PlatformTransactionManager,将事务公开给当前执行线程内的所有数据访问操作。注意:这不会传播到方法内新启动的线程。
@Transactional由面向方面的编程提供支持。因此,当从一个 Bean 调用另一个 Bean 时,就会发生处理。在上面的示例中,该方法是从同一个类调用的,因此不能应用代理。
@Transactional当在事务块内调用没有的方法时,父事务将继续存在于新方法中。它将使用来自父方法(带有@Transactional的方法)的相同连接,并且在被调用方法(没有@Transactional的方法)中引起的任何异常都将导致事务按照事务定义中的配置进行回滚。
如果@Async使用注释,则应格外小心事务。当@TransactionalSpring@Component调用注释有对异步方法的调用的方法@Async时,任务执行器将在稍后的时间安排和执行,因此被视为“新鲜”调用,即没有事务上下文。如果该@Async方法(或@Component声明它的方法)@Transactional本身不是 Spring 将不会管理任何所需的事务。
为了让 Spring 管理方法的事务,@Async或者@Component方法本身应该声明注释@Transactional,这样即使方法异步执行,Spring 也会管理事务。
小智 2
Spring 不会为同一类中的调用创建事务,因此无论您是否使用事务性注释,setXor 都将在与数据相同的事务中执行。
我认为 setXor 和 data 也将在主线程之外的一个线程中执行。
| 归档时间: |
|
| 查看次数: |
22550 次 |
| 最近记录: |