事务

数据库事务:Database Transaction为单个逻辑工作单位执行一系列操作

ACID:Atomic原子、Consistent一致、Insulation隔离、Duration持久

 

spring事务管理:

 

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值