springboot事务嵌套问题_SpringBoot2.0中的事务
@Transactional
在SpringBoot2.0中使⽤使⽤需要注意的地⽅。
1. 加@Transactional的⽅法不能是private和protected修饰,private会直接报编译错误,protected不会报错。但是事务不起作⽤。
2. @Transactional可以放在Controller下⾯直接起作⽤,看到⽹上好多同学说要放到@Component下⾯或者@Service下⾯,经过试验,可以不⽤放在这两个下⾯也起作⽤。
3. @Transactional引⼊包问题,她有两个包:ansaction.Transactional; 和 import
ansaction.annotation.Transactional; 这两个都可以⽤,对⽐了⼀下他们两个的⽅法和属性,发现后⾯的⽐前⾯的强⼤。建议后后⾯的。
4. @Transactional采⽤AOP实现的。
在进⾏⽅法调⽤的时候,发现这个⽅法有事务注解,AOP⾸先会检测到,然后⽤代理类采⽤反射机制进⾏调⽤。
1. ⾸先调⽤了CglibAopProxy.intercept()⽅法。
2. 接下来调⽤ReflectiveMethodInvocation.proceed()⽅法,
3. TransactionInterceptor.invoke()
4. TransactionAspectSupport.invokeWithinTransaction()
5. ateTransactionIfNecessary()
6. Transaction(),创建了⼀个新的事务。
5. PlatformTransactionManager 这个接⼝中定义了三个⽅法 getTransaction创建事务,commit 提交事务,rollback 回滚事务。她的实现类是 AbstractPlatformTransactionManager这个。
6. 在Transactional这个中,有⼀个参数 Propagation的属性,他⾥⾯有七中类型,REQUIRED,REQUIRES_NEW,NESTED,这三个都是新建事务,其他的都不实⽤事务。
8. 当⼀个⽅法中嵌套使⽤@Transactional。如果没有设置属性 Propagation,默认为REQUIRED,她只会在上下⽂创建⼀个事务。当设置属性为REQUIRES_NEW的时候,她会创建⼀个新的事务。
9. try catch的使⽤,当⼀个事务中如果对异常进⾏了捕获,⽽且没有抛出异常的情况下,事务是不起作⽤的,只有抛出异常,事务会⾃⼰trycatch,然后进⾏回滚操作。
10. 问题注意:
如果使⽤Mysql数据库,需要注意创建表的引擎。⽀持InnoDD,默认创建表是 MyISAM
springboot aop如果配置了 ⾃动创建,需要这样配置
jpa:
hibernate:
ddl-auto: update
show-sql: true
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
参考学习:腾讯公开课,云析学院公开课。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。