数据库事务:Database Transaction为单个逻辑工作单位执行一系列操作
ACID:Atomic原子、Consistent一致、Insulation隔离、Duration持久
Spring注解方式事务的实现机制:https://blog.csdn.net/qq_29347295/article/details/79019221
在系统中调用@Transactional,使用AOP代理(CglibAopProxy , JdkDynamicAopProxy ),生成代理对象据@Transactional 属性配置信息
代理对象决定该声明@Transactional的目标方法是否由拦截器TransactionInterceptor 来使用拦截
在TransactionInterceptor拦截时,在目标方法执行前加入事务、执行目标方法
根据是否出现异常,利用抽象事务管理器AbstractPlatformTransactionManager 操作数据源提交或回滚事务
底层事务处理:PlatformTransactionManager具体实现类实现:DataSourceTransactionManager
@Transactional 注意事项
@Transactional(propagation= Propagation.REQUIRED,rollbackFor= MyException.class)
1、正确设置propagation属性
Propagation.REQUIRED:有事务加入,没有新建
Propagation.REQUIRES_NEW:新建事务,原来的挂起,新的执行完毕执行老的事务
Propagation.NOT_SUPPORTED:不开启事务
Propagation.MANDATORY在已有事务中执行,否则抛出异常
Propagation.NEVER没有事务中执行,否则抛出异常
Propagation.SUPPORTS其他bean调用这个方法,其中bean中声明事务就用事务,否则不用
2、rollbackFor属性
默认,抛出未检查异常(继承自 RuntimeException)或Error,Spring将回滚事务
抛出其他类型异常,期望Spring能够回滚事务,指定rollbackFor
3、只应用到public方法才有效
TransactionInterceptor调用目标方法进行拦截前,DynamicAdvisedInterceptor(CglibAopProxy的内部类)的intercept方法或JdkDynamicAopProxy的invoke方法会间接调用AbstractFallbackTransactionAttributeSource(获取事务配置属性)的computeTransactionAttribute方法
检查目标方法修饰符是不是public,不是则不获取Transactional属性配置不用TransactionInterceptor拦截目标方法 进行事务管理
4、Spring 的 AOP 的自调用问题
目标方法由外部调用,目标方法才由spring生成代理对象来管理
同一类中其他没有@Transactional注解的方法内部使用有Transactional 注解的方法,则有@Transactional 注解的方法的事务被忽略,不会发生回滚
5、事务隔离级别
Isolation.READ_UNCOMMITTED读取未提交数据(脏读、不可重复读)
Isolation.READ_COMMITTED读取已提交数据(不可重复读,幻读)
Isolation.REPEATABLE_READ可重复读(幻读)
Isolation.SERIALIZABLE串行化
对于4的第二条我做了一个小实验,这个注解还是起作用的?这就奇怪了
static String a ;
public static void main(String[] args) {
a = "1";
System.out.println(a);
test2();
System.out.println(a);
test3();
System.out.println(a);
}
@Transactional
public static void test2(){
a = "3";
System.out.println(4/0);
}
public static void test3(){
a="4";
System.out.println(4/0);
}
注意:
1、被应用到public上
2、运行时异常回滚、不受检查unchecked的例外回滚
编译器会检查到的异常叫受检查例外或说受检查异常
3、具体的类、方法上开启事务
4、注解不能继承:使用基于类的代理时,事务的设置不被基于类的代理识别,对象也不被事务代理包装
https://www.cnblogs.com/yepei/p/4716112.html
https://www.cnblogs.com/caoyc/p/5632963.html
https://blog.csdn.net/nginxs/article/details/77314199
https://blog.csdn.net/w_x_s_h_h/article/details/79216779
https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1/9744607?fr=aladdin