Springboot @Transactional 源码解读

基础知识:


编码式事务处理:基于编码实现
声明式事务处理:基于AOP (本篇文章基于此方式)
    实现方式:
        配置文件:xml事务规则声明
        注解:@Transactional
  • @Transactional 实现:

1.声明注解配置 DataSourceTransactionManager 也可使用注解@EnableTransactionManagement (在Springboot中可直接跳过此步骤)

<tx:annotation-driven />
<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>

2.使用@Transactional注解,在方法上、类上。

  • @Transactional各属性描述

    ​​​

    name

    选择指定的事务管理器(在存在多事务管理器时使用:TransactionManager)。

    propagation

    事务传播行为,默认为REQUIRED。已有事务则加入,否则重新创建一个。

    isolation

    事务隔离级别,默认为DEFAULT。

    timeout

    事务超时时间,默认为-1, 如果超时未完成则回滚事务。

    read-only

    只读事务,默认为false,无需事务处理是 可设置read-only=true。

    rollback-for

    事务回滚的异常类型,如果多个则逗号隔开。需继承自

    RuntimeException 的异常类

    no-rollback-for

    抛出指定的异常类型,不回滚。

  • propagation:事务传播行为

REQUIRED required

支持事务。存在则加入,不存在则新建

 

REQUIRES_NEW requires_new

支持事务。存在则挂起当前事务,不存在则新建

 

NESTED nested

支持事务。存在则嵌套成一个子事务,不存在则新建

 

SUPPORTS supports

支持事务。存在则支持,不存在则不管他

不回滚

NOT_SUPPORTED not_supported

不支持事务。存在则挂起,执行完后则恢复

不回滚

MONDATORY mondatory

支持事务。存在则加入,不存在则抛出异常

 

NEVER

不支持事务。存在则抛出异常

不回滚

  • isolation:事务隔离级别

DEFAULT

默认使用数据库默认的隔离级别

 

READ_UNCOMMITTED

未提交的事务可以被读取

产生脏读、不可重复读、幻读

READ_COMMITTED

已提交的事务才可被读取

产生不可重复读、幻读

REPEATABLE_READ

 

产生幻读

SERIALIZABLE

 

防止脏读、不可重复读、幻读

  • 基于注解的实现机制

    • 调用注解方法
    • 生成代理对象 -  CglibAopProxy  调用内部类的方法DynamicAdvisedInterceptor.intercept()
    • TransactionInterceptor.invoke()拦截器拦截,在目标方法执行之前创建并加入事务
    • AbstractPlatformTransactionManager抽象事务管理器操作数据源DataSource提交或回滚事务

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值