spring 事务的启用
spring boot中使用注解@EnableTransactionManagement来启用事务
事务aop代理方式的选择与配置
我们知道,spring事务是基于aop来实现的,而spring的aop是基于动态代理,spring中的动态代理有两种方式,jdk动态代理和cglib动态代理。spring默认时用jdk代理,因为从jdk 1.8之后jdk动态代理的性能已经高于cglib。jdk代理和cglib代理各自有一些限制:jdk代理只能代理接口方法,cglib则只能代理可以被覆盖的方法。
那么我们如何选择事务aop的代理方式呢?@EnableTransactionManagement注解有个参数,设置proxyTargetClass = true则表示强制使用cglib代理,否则默认使用jdk代理。
spring和 jdk的@Transactional注解对比
jdk中有一个javax.transaction.Transactional注解,spring中有一个org.springframework.transaction.annotation.Transactional注解,这两个注解是不是可以无差别使用呢?
笔者在自己的机器上做了实验,结果是:使用cglib代理的时候,jdk的Transactional注解是可以生效的,而使用jdk代理的时候,jdk的Transactional注解是不生效的。自己兄弟不相认,很好笑。