spring事务(三)

spring事务

spring事务类型

spring支持以下两种事务:

  • 编程式事务
  • 声明式事务

spring编程式事务(不使用)

编程式事务管理是 侵入性事务管理 ,使用TransactionTemplate或者直接使用PlatformTransactionManager接口,对于编程式事务管理,Spring推荐使用TransactionTemplate的实现类。这种入侵性的事务管理我们一般不用,因为这属于硬编码的写法,业务一改,就必须改代码,这是十分不好的。

public class UserService {
  private final PlatformTransactionManager transactionManager;
  public UserService(PlatformTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
  }
  public void createUser() {
    TransactionStatus txStatus =
        transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
      userMapper.insertUser(user);
    } catch (Exception e) {
      transactionManager.rollback(txStatus);
      throw e;
    }
    transactionManager.commit(txStatus);
  }
}

spring声明式事务

配置事务管理器

属于前置工作,要使用spring的事务管理,需要配置事务管理器。

@Configuration
public class DataSourceConfig {
  @Bean
  public DataSourceTransactionManager transactionManager() {
    return new DataSourceTransactionManager(dataSource());
  }
  @Bean
  public DataSource dataSource(){
      ....
      return dataSource;    
  }
}

spring声明式事务有两种方式,一种是通过xml文件进行配置,一种是通过注解的方式进行配置。我个人比较喜欢使用注解的方式。

相关注解

开启事务管理功能: @EnableTransactionManagement

事务注解: @Transactional

@Transactional

@Transactional 实质是使用了 JDBC 的事务来进行事务控制的,@Transactional 基于 Spring 的AOP

@Transactional的属性

  • name 属性指定选择哪个事务管理器。
  • propagation 事务的传播行为,默认值为 REQUIRED。
  • isolation 事务的隔离度,默认值采用 DEFAULT。
  • timeout 事务的超时时间,默认值为-1。
  • read-only 指定事务是否为只读事务,默认值为 false;
  • rollback-for 用于指定能够触发事务回滚的异常类型
  • no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。

事务的隔离度

刚好对应数据库的几个隔离级别,默认是DEFAULT(数据库启用的隔离级别)

@Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据
 
@Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据
 
@Transactional(isolation = Isolation.REPEATABLE_READ):可重复读
 
@Transactional(isolation = Isolation.SERIALIZABLE):串行化

事务的传播行为

原文:https://www.cnblogs.com/mseddl/p/11577846.html

  • PROPAGATION_REQUIRED
    Spring默认的传播机制,能满足绝大部分业务需求,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行
  • PROPAGATION_REQUES_NEW
    该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可
  • PROPAGATION_SUPPORT
    如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务
  • PROPAGATION_NOT_SUPPORT
    该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码
  • PROPAGATION_NEVER
    该传播机制不支持外层事务,即如果外层有事务就抛出异常
  • PROPAGATION_MANDATORY
    与NEVER相反,如果外层没有事务,则抛出异常
  • PROPAGATION_NESTED
    该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。
posted @   鸭梨的药丸哥  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示