spring事物之事务传播机制(2)

目录

事务的特性

事务的传播机制

spring事物回滚机制

spring事物失效的几种原因 

图解spring事物原理


事务的特性

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
  • 一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
  • 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  • 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
     

事务的传播机制

事务的传播性一般用在事务嵌套的场景,比如一个事务方法里面调用了另外一个事务方法,那么两个方法是各自作为独立的方法提交还是内层的事务合并到外层的事务一起提交,这就是需要事务传播机制的配置来确定怎么样执行。

常用的事务传播机制如下:

  • PROPAGATION_REQUIRED

        Spring默认的传播机制,能满足绝大部分业务需求,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行

  • PROPAGATION_REQUES_NEW

        该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可

  • PROPAGATION_SUPPORT

        如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务

  • PROPAGATION_NOT_SUPPORT

        该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码

  • PROPAGATION_NEVER

        该传播机制不支持外层事务,即如果外层有事务就抛出异常

  • PROPAGATION_MANDATORY

        与NEVER相反,如果外层没有事务,则抛出异常

  • PROPAGATION_NESTED

        该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。

传播规则回答了这样一个问题:一个新的事务应该被启动还是被挂起,或者是一个方法是否应该在事务性上下文中运行。

spring事物回滚机制

         spring的AOP既声明式事物管理默认是针对unchecked exception回滚

        spring的事物边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit 或 rollback

        @Transactional底层实现方式,是通过动态代理,动态代理又分为JDK和CGLIB

spring事物失效的几种原因 

7.如果method方法有事物,method2方法是以非事物或者新事物运行,则不属于同一事物

1、spring的事务注解@Transactional只能放在public修饰的方法上才起作用,如果放在其他非public(private,protected)方法上,虽然不报错,但是事务不起作用

2、如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB引擎

3、spring默认是对RuntimeException异常,事务回滚;但是抛出Exception,事务不回滚;

@Transactional(rollbackFor={RuntimeException.class, Exception.class})这样会回滚

4.乱用try{}catch(Exception){},那么在try里面的代码就脱离了事物的管理,如要事物生效需要在catch中throw  new RuntimeExecption异常

5、在类A里面有方法a 和方法b, 然后方法b上面用 @Transactional加了方法级别的事务,在方法a里面 调用了方法b, 方法b里面的事务不会生效。原因是在同一个类之中,方法互相调用,切面无效 ,而不仅仅是事务。这里事务之所以无效,是因为spring的事务是通过aop实现的。

6.在@Transactional注解的方法中,再调用本类中的其他方法method2时,那么method2方法上的@Transactional注解是不会生效的(如:通过this.method2调用则method2方法上的事物不会生效,会继承method的事物,如果需要method2事物生效,则需要通过【注入本类或其他类service.method2调用】,其思想是需要AOP代理类去调用增强)

@Transactional(propagation=Propagation.REQUIRED)
public void method(){

    this.method2();
}

@Transactional(propagation=Propagation.REQUIRED)
public void method2(){
    //...
}

 在目标对象内部的自我调用,也就是通过this.指向的目标对象将不会执行方法的增强

图解spring事物原理

public class TestServiceImpl


//总结:此方法在一个事物中, A,B操作全部失败
@Transactional(propagation=Propagation.REQUIRED)
public void method(){
    this.methodA();
    this.methodB();
}

public void methodA(){
    //...
    int i = 1/0;
}

public void methodB(){
    //...
}

public class TestServiceImpl

TestServiceImpl testService;

//总结:此方法在一个事物中, A,B操作全部失败
@Transactional(propagation=Propagation.REQUIRED)
public void method(){
    testService.methodA();
    testService.methodB();
}

public void methodA(){
    //...
    int i = 1/0;
}

public void methodB(){
    //...
}

总结:上面两种情况不管使不使用代理调用方法A和方法B,方法method都处在一个事物中,操作全部失败。

即使在methodA和methodB上加上@Transactional注解,结果一样,这里的@Transactional使用默认传播机制

public class TestServiceImpl

TestServiceImpl testService;

//总结:方法A,B处于单独事物中,个子保持事物的一致性

public void method(){
    testService.methodA();
    testService.methodB();
}
@Transactional
public void methodA(){
    //...
    int i = 1/0;
}
@Transactional
public void methodB(){
    //...
}
public class TestServiceImpl

TestServiceImpl testService;

//总结:方法A,B处于单独事物中,个子保持事物的一致性
@Transactional
public void method(){
    testService.methodA();
    testService.methodB();
}
@Transactional(propagation=Propagation.REQUIRED_NEW)
public void methodA(){
    //...
    int i = 1/0;
}
@Transactional(propagation=Propagation.REQUIRED_NEW)
public void methodB(){
    //...
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值