Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • Spring常见面试题
  • Spring常用注解与接口
  • 容器与Bean
  • AOP
  • Spring事务
  • Spring中的设计模式
  • 手撸Spring

  • 事务嵌套
    • 在同一个类中调用带有@Transactional注解的方法如何合并一个事务?
  • 事件监听器
  • Spring自定义异常
  • Spring
Nreal
2024-03-12
目录

事务嵌套

# 在同一个类中调用带有@Transactional注解的方法如何合并一个事务?

举例:

@Service
public class A{
    
    public void action(){
        dosome();
    }
    
    @Transactional
    public void dosome(){
        doa.insert(new Object());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

推荐:Spring AOP,AspectJ 对方法进行切面

  1. 依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  2. 启动类

    @SpringBootApplication
    @EnableAspectJAutoProxy(exposeProxy = true)
    public class DonngPartsApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(DonngPartsApplication.class, args);
    	}
    
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  3. 修改代码

    @Service
    public class A{
        
        public void action(){
            ((A) AopContext.currentProxy()).dosome();
        }
        
        @Transactional
        public void dosome(){
            doa.insert(new Object());
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
IOC篇
事件监听器

← IOC篇 事件监听器→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式