spring事务失效的原因(8种)

  1. 数据库引擎不支持事务
mysql5.5.5 默认存储引擎是InnoDB(支持事务),之前是MyISAM(不支持事务操作)
  1. 没有被 Spring 管理
当前类如果不被spring管理(例如不加@service),那么事务就失效了
  1. 方法不是 public 的
@Transactional 只能用于public方法上,如果要用在非public方法上,开启AspectJ代理模式
  1. 自身调用问题
事务开启必须在本类的开始(也就是说外部调用事务才会生效,不可以本类的方法调用本类的事务,因为这样的话没有经过spring的代理类)
  1. 数据源没有配置事务管理器
spring一般使用TransactionMananger(事务管理器)进行管理,可以通过Spring的注入来完成此功能。
JDBC中是通过Connection对象进行事务管理,默认是自动提交事务,可以手工将自动提交关闭,通过commit方法进行提交,rollback方法进行回滚,如果不提交,则数据不会真正的插入到数据库中。
Hibernate中是通过Transaction进行事务管理,处理方法与JDBC中类似。
  1. 不支持事务
4种事务隔离级别由低往高:
    READ UNCOMMITTED,读取未提交的数据(脏读)
    READ COMMITTED,读取已提交的数据,这也是oracle默认的隔离级别(不可重复读)
    REPEATABLE READ,可重复读取数据,这也是Mysql默认的隔离级别(幻读)
    SERIALIZABLE,可串行化读
7种事务传播机制:[Propagation.xxx]
    REQUIRED:如果当前方法有事务则加入事务,没有则创建一个事务
    NOT_SUPPORTED:不支持事务,如果当前有事务则挂起事务运行
    REQUIREDS_NEW:新建一个事务并在这个事务中运行,如果当前存在事务就把当前事务挂起。新建的事务的提交与回滚一挂起事务没有联系,不会影响挂起事务的操作 
   MANDATORY:强制当前方法使用事务运行,如果当前没有事务则抛出异常
   NEVER:当前方法不能存在事务,即非事务状态运行,如果存在事务则抛出异常
   SUPPORTS:支持当前事务,如果当前没事务也支持非事务状态运行
   NESTED:如果当前存在事务,则在嵌套事务内执行。嵌套事务的提交与回滚与父事务没有任务关系,反之,当父事务提交嵌套事务也一起提交,父事务回滚会也回滚嵌套事务的。
            如果当前没有事务,则新建一个事务运行,这时候则与PROPAGATION_REQUIRED场景一致.
  1. 异常被吃了
事务内部出现异常进行捕获,事务无法回滚
  1. 异常类型错误
方法内部出现异常进行捕获,捕获之后再抛出异常,事务默认回滚的是:RuntimeException,触发其他异常的回滚,需要在注解上进行配置【@Transactional(rollbackFor = Exception.class】,仅限于Throwable异常类及其子类
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值