#千锋逆战事务

一、spring的事务提供了三个核心接口PlaffromTransactionManager、TransactionDefinition、TransactionStatus

PlaffromTransactionManager该接口主要用于管理事务

一般我们使用时sping的事务会指定一个我们期望用的事务管理器,不然spring会用默认的事务管理器可能无法达到我们的希望效果。

TransactionDefinition接口是事务定义的描述对象,该对象中定义了事务规则,并获取食物相关信息的方法。

TransactionStatus接口是事务的状态接口

spring的事务提供了统一的事务编程模型

提供了编程式事务和声明式事务,编程式事务可以精确的定义。

声明式事务只需要简单的配置由spring的事务实现。基于aop的实现

事务的传播行为7个,

REQUIRED需要一个事务

REQUIRES_NEW开启一个新事务去处理

MANDATORY必须一个事务 不再,不是事务操作异常

NEVER必须不是一个事务不然则报错

SUPPORTS支持不是一个事务,是事务也行

NOT_SUPPORTED不支持不是一个事务,如果当前线程在一个事务中,则挂起事务

NESTED嵌套的事务,有点像REQUIRED,但是有些区别

isolation是事务的隔离级别,DEFAULT默认为可重复度,四个级别,串行、可重复读、读已提交、读未提交

事务可能失效的原因

1.如果不是Innodb存储引擎,innodb和db支持

2.没有指定rollbackFor参数。

3. 没有指定transactionManager参数,默认的transactionManager并不是我期望的,以及一个事务中涉及到了多个数据库。

4. 如果AOP使用了JDK动态代理,对象内部方法互相调用不会被Spring的AOP拦截,@Transactional注解无效。

5. 如果AOP使用了CGLIB代理,事务方法或者类不是public,无法被外部包访问到,或者是final无法继承,@transactional注解无效。

在一个方法中调用另一个事务操作对于不同的传播级别:

1.当传播级别为为REQUIRED时,第一种情况A和B都会回滚。

2.。当传播级别为RQUIRED_NEW时,第一种情况A可以成功提交,B回滚,第二种情况A回滚,B可以正确提交,二者互不影响。(在A事务捕获B事务异常的情况下,保证A事务提交)

3.当传播级别为NESTED时,第一种情况A可以正常提交,B回滚,第二种情况二者都会回滚。

你可能感兴趣的:(#千锋逆战事务)