Spring 事务传播属性
3 个 API 定义类
Spring 事务底层 API 定义主要有 PlatformTransactionManager、TransactionDefintion 和 TransactionStatus。
-
PlatformTransactionManager 是事务管理器的顶层接口,该接口规定了事务的基本操作:获取事务、提交事务、回滚事务。
public interface PlatformTransactionManager { TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
-
TransactionStatus 事务状态,比如是否有保存点、是否是新事务、是否设置了 Rollback 等
public interface TransactionStatus extends SavepointManager, Flushable { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); @Override void flush(); boolean isCompleted(); }
-
TransactionDefintion` 事务属性的定义,包含以下 5 个属性:事务传播级别、事务隔离级别、超时时间、是否为只读事务、事务配置
public interface TransactionDefinition { int PROPAGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY = 2; int PROPAGATION_REQUIRES_NEW = 3; int PROPAGATION_NOT_SUPPORTED = 4; int PROPAGATION_NEVER = 5; int PROPAGATION_NESTED = 6; int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED; int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ; int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE; int TIMEOUT_DEFAULT = -1; int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); String getName(); }
事务隔离级别
-
ISOLATION_DEFAULT :默认隔离级别,对应数据源的隔离级别
-
ISOLATION_READ_UNCOMMITTED : 未提交读
-
ISOLATION_READ_COMMITTED : 提交读 (Oracle 默认)
-
ISOLATION_REPEATABLE_READ:可重复读(MySQL 默认)
-
ISOLATION_SERIALIZABLE:序列化
事务传播行为配置
-
NEVER :当前方法不应该在事务中,如果调用端存在事务,则抛出异常
-
NOT_SUPPORTED :当前方法不支持事务,如果调用端存在事务,该事务将被挂起
-
SUPPORTS :当前方法支持事务,调用端存在事务则在同一个事务中,如果不存在就在无事务状态中运行
-
REQUIRED : 当前方法必须在事务中,如果调用端有事务则被调用端将在该同一事务中进行,否则被调用端将开启一个新事务
-
REQUIRES_NEW : 当前方法必须在自己的事务中,如果调用端有事务时,调用端事务将被挂起,被调用端会开启自己的新事物,被调用端事务提交后,调用端事务被恢复
-
NESTED : 嵌套事务。被调用端的事务被嵌套在调用端事务中,如果调用端没有事务时被调用端将创建新的事务,与 REQUIRES_NEW 不同的是,当调用端发生异常时,两者都会回滚,当被调用端发生异常且异常被调用端捕获时,只有被调用端回滚,调用端不受影响
-
MANDATORY :强制事务。如果没有事务将抛出异常
事务传播行为示例
以下示例代码行为
class A{ @Autowired private B b; @Transactional(propagation = Propagation.XXX, rollbackFor = Exception.class) void a(){ aMapper.edit(); // int i = 1 / 0; // try{ b.b(); // } catch(Exception e){ // } // int i = 1 / 0; } } class B{ @Transactional(propagation = Propagation.XXX, rollbackFor = Exception.class) void b(){ bMapper.edit(); // int i = 1 / 0; } }
AOP 代理与事务
1、由于代理机制,调用同类内部的方法时,内部方法不会被代理,所以事务的设置也不会生效
2、私有方法也不会被代理
源码解读:https://www.cnblogs.com/dennyzhangdd/p/9602673.html
事务失效:https://blog.csdn.net/j1231230/article/details/105534599