day4 spring事务

spring事务

事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败则所有操作都失败。(比如:银行转账)

四个特性 (ACID)

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

事务操作(环境搭建)

controller + service + dao

事务引入
  1. 理论上,事务可以加到 JavaEE 三层中的任何层,但最好加到 service 层。

  2. 在spring 进行事务管理操作

    有两种方式,编程式事务管理和声明式事务管理(使用)

  3. 声明式事务管理

    1. 基于注解方式
    2. 基于 xml 配置文件方式
  4. 在 spring 进行声明式事务管理,底层使用aop

  5. spring 事务管理 api

    提供了一个接口,代表事务管理器,这个接口针对不同框架提供了不同的实现类。PlatformTransactionManager

注解声明式事务管理
  1. 在 spring 配置文件中配置事务管理器

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="datasource"></property>
    </bean>
    
  2. 在 spring 配置文件中开启注解

    引入tx命名空间
    
    <!-- 开启事务管理器 -->
    <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
    
  3. 在 service 类上(或者 service 类里面的方法上)添加事务注解

    @Service
    @Transactional
    public class service{}
    

    (1) @Transactional:既可以添加到类上,也可以添加到方法上

    (2) 如果把注解添加到类上,则这个类中的所有方法都将被添加事务

    (3) 如果把注解添加到类的方法上,则只为该方法添加事务。

声明式事务管理(参数配置)
  1. 在 service 类上添加注解 @Transactional ,在这个注解里可以配置事务相关参数。

    1. propagation事务传播行为

      多事务方法之间进行调用,这个过程中事务是如何进行管理的。

      spring框架中 7 中事务传播行为

      1. Required:如果方法1本身有事务,调用无事务方法2后,统一使用方法1的事务。如果没有事务,将创建一个新的事务,然后在自己的事务内运行。
      2. Required_new:无论方法是否有事务,都创建一个新的事务。
      3. Supports:如果事务在运行,当前方法在该事务内运行,否则它可以不运行在事务中。
      4. Not_Supportes:当前方法不应该运行在事务中,如果有运行的事务,则将他挂起。
      5. Mandatory:当前的方法必须运行在事务内部,如果没有正在运行的事务,就抛出异常。
      6. Never:当前的方法不应该运行在事务中,如果有运行的事务,则直接抛出异常。
      7. Nested:如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在他自己的事务内运行。
      @Transactional(propagation= Propagation.REQUIRED)
      
    2. isolation事务隔离级别

      事务的特性:隔离性,指多事务操作之间不会产生影响,不考虑隔离性会产生很多问题。(脏读,不可重复读,虚读)

      1. 脏读:多事务。一个未提交事务读取到另一个未提交事务的数据。

        事务a 修改了数据,但未提交时,事务b 可以获取到修改后的数据,此时事务a 进行了回滚操作,那么事务b 获取到的数据就是脏数据,进行的行为就是脏读。

      2. 不可重复读:一个未提交事务读取到另一个已经提交事务的数据。

        事务a 和 事务b 都读取到了某条数据,事务b 进行了处理并提价了该操作,使数据发生变化,此时事务a 可以读取到发生变化后的数据。

      3. 虚读:一个未提交数据读取到另一个提交事务添加的数据。

      通过设置事务隔离级别可以解决这三个问题。

      级别脏读不可重复读虚读
      Read_Uncommitted
      (读未提交)
      Read_Committed
      (读已提交)
      Repeatable_Read
      (可重复读)
      Serializable
      (串行化)
      @Transactional(isolation = Isolation.REPEATABLE_READ)	// MYSQL 默认
      
    3. timeout超时

      事务需要在一定时间内进行提交,超出时间就会进行回滚。

      默认为-1,不回滚。设置数字以 秒 为单位。

    4. readonly是否只读

      读:查询操作,写:添加修改删除操作。

      readonly 默认值为 false,表示可写可读。

      设置为 true,就只能进行查询操作。

    5. rollbackFor回滚

      设置出现哪些异常进行事务回滚。

    6. noRoolbackFor不回滚

      设置出现哪些异常不进行事务回滚。

xml 声明式事务管理

在 spring 配置文件中进行配置

  1. 配置事务管理器
  2. 配置通知
  3. 配置切入点和切面

完全注解式 事务操作

  1. 创建配置类,使用注解,替代xml配置文件

    @Configuration
    @ComponentScan(basePackages="")	//组件扫描
    @EnableTransactionManagement	//开启事务
    public class Config{
        //创建数据库连接池
        @Bean
        public DruidDataSource getDruidDataSource(){
    		DruidDataSource dataSource = new DruidDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql:///user_db");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            return dataSource;
        }
        
        //创建事务管理器
        @Bean
        public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
            DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
            transactionManager.setDataSource(dataSource);
            return transactionManager;
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值