Spring中事务相关

又想到了小米,留下了不甘的泪水,哈哈哈哈


1. 事务传播行为的7种策略

  1. REQUIRED:必需的(默认值)
    如果当前没有事务运行,则会开启一个新的事务;如果当前已经有事务运行,则方法会运行在当前事务中,“你没有,我开启,你有了,我加入”
  2. REQUIRES_NEW:新事务
    如果当前没有事务事务运行,则会开启一个新的事务;如果当前已经有事务运行,则会将原事务挂起,重新开启一个新的事务。当新的事务运行完毕后,再将原来的事务释放,“你没有我开启,你有了我造新的”
  3. SUPPORTS:支持
    如果当前有事务运行,则方法运行在当前事务中;如果没有事务运行,则不在事务中运行,“有就有,没有拉到”
  4. NOT_SUPPORTED:不支持
    如果当前事务运行,则会将事务挂起,如果当前没有事务运行,则它也不会运行在事务中,“有我不要,没有正好”
  5. MANDATORY:强制
    当前方法必须在事务中,如果没有事务,则直接抛出异常,“要干活必须有,没有就打死不干”
  6. NEVER:不允许
    当前方法不允许运行在事务中,如果当前已经有事务运行,则抛出异常,“要干活不准有,有了不干活”
  7. NESTED:嵌套
    如果当前没有事务运行,则开启一个新的事务;如果当前已经有事务运行,则会记录一个保存点,并继续运行在当前事务中。如果子事务运行中出现异常,则不会全部回滚,而是回滚到哦上一个保存点

在注解中,添加propagation属性即可修改

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addPoint() {
    System.out.println("addPoint 添加积分 ......");
}

2. Spring事务的三大核心

  • PlatformTransactionManager:平台事务管理器,做事务控制
  • TransactionDefinition:事务定义,包括事务的隔离级别,事务的传播行为,是否为读写事务等等
  • TransactionStatus:事务状态,是否有保存点,是否完成…

3. 声明式事务

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="saveAndQuery"/>
        <tx:method name="addMoney"/>
        <tx:method name="subtractMoney"/>
    </tx:attributes>
</tx:advice>

在这个 xml 的配置中,配置事务通知,需要指定事务管理器,并配置事务覆盖的方法,必要的还会配置事务传播行为。而这个<tx:advice>标签的底层,其实是注册了一个 TransactionInterceptor

public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable

可以发现它实现了 MethodInterceptor 接口!通过前面 AOP 部分的学习,我们知道 MethodInterceptor 接口是 AOP 增强的核心拦截器接口,利用 AOP 生成的代理对象中都会包含一组 MethodInterceptor 接口的实现类对象

注解式事务用到的两个注解@EnableTransactionManagement@Transactional


暂且这么多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方圆想当图灵

嘿嘿,小赏就行,不赏俺也不争你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值