Spring-事务管理

事务概念

  1. 什么是事务
    • 事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败
    • 典型场景:银行转账
  2. 事务四大特性(ACID)
  • 原子性:
  • 一致性: 操作后的总量是不变的
  • 隔离性:
  • 持久性:

事务操作(搭建事务操作环境)

  1. 创建数据库表,添加记录

  2. 创建service ,搭建dao,完成对象创建和注入关系

    • service注入dao ,在dao注入JdbcTemplate,在jdbcTemlate注入ID

      @Service
      public class UserService {
      
          //注入Dao
          @Autowired
          private UserDao userDao;
      
      }
      
      
      ```java
      @Resource
      public class UserDaoImpl {
          
          @Autowired
          private JdbcTemplate jdbcTemplate;
          
      }
    
  3. 在dao 创建两个方法:多钱和少钱的方法,在service 创建方法(转账的方法)

    • dao
    @Repository
    public class UserDaoImpl implements UserDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Override
        public void addMoney() {
            String sql="update t_account set money=money+? where username=?";
            jdbcTemplate.update(sql, 100, "mary");
    
    
        }
    
        @Override
        public void reduceMoney() {
            String sql="update t_account set money=money-? where username=?";
            jdbcTemplate.update(sql, 100, "lucy");
    
        }
    }
    
    • service

      @Service
      public class UserService {
      
          //注入Dao
          @Autowired
          private UserDao userDao;
      
          //转账的操作
          public void accountMoney() {
              //lucy少一百
              userDao.reduceMoney();
              //mary 多一百
              userDao.addMoney();
          }
      
      
      }
      
  4. 上面代码,如果正常执行没有问题,但是如果代码执行过程中出现异常,有问题

    • 使用事务进行解决

    • 使用事务操作的过程

      try {
      
          //第一步 开启事务操作
      
          //第二步 进行业务操作
          
          //lucy少一百
          userDao.reduceMoney();
      
          /*模拟异常*/
          int i=10/0;
      
          //mary 多一百
          userDao.addMoney();
          
          //第三步 没有发生异常,提交事务
          
          
          
      } catch (Exception e) {
          e.printStackTrace();
          // 出现异常,事务回滚
          
      }
      
  5. Spring 事务管理的介绍

    • 事务添加到JAVAEE三层价格里面Service 层(业务逻辑层)
    • 在Spring 进行事务管理操作
      • 有两种方式:编程式事务管理和声明式事务管理(使用)
    • 声明式事务管理
      • 基于注解
      • 基于xml配置文件方式
    • 在Spring 进行声明式事务管理,底层AOP原理
    • Spring事务管理API
      • 提供一个接口(PlatformTransactionManager),代表事务管理器,这个接口针对不同的框架提供不同的实现类
  6. 事务操作(注解声明式事务管理)

    • 在Spring配置文件配置事务管理器

      <!--创建事务管理器-->
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!--注入数据源-->
          <property name="dataSource" ref="dataSource"></property>
          
      </bean>
      
    • 在Spring 配置文件,开启事务注解

      • 在Spring 配置文件中引入名称空间tx

        <beans xmlns="http://www.springframework.org/schema/beans"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:context="http://www.springframework.org/schema/context"
               xmlns:aop="http://www.springframework.org/schema/aop"
               xmlns:tx="http://www.springframework.org/schema/tx"
        
               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx    http://www.springframework.org/schema/tx/spring-tx.xsd
        
        ">
        
      • 开启事务的注解

        <!--开启事务的注解-->
        <tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
        
    • 在Service类上面(获取Service类里面方法上面) 添加事务注解

      • @Transactional 这个注解可添加到类上面,也可以添加到方法上面
      • 如果把这个注解添加到类上面,这个类里面所有的方法都添加事务
      • 如果把这个注解添加到方法上面,为这个方法事务
  7. 事务操作(声明式事务管理参数配置)

    • 在Service类上面添加注解@Transactionl,在这个注解里面可以配置事务相关参数

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yp61EBcq-1599004849814)(C:\Users\Administrator\Desktop\spring图片\Spring2.png)]

      • propagation: 事务传播行为

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

        2. 7种传播行为:

          • REQUIRED: 如果add方法本身有事务,调用updata方法之后,update使用当前add方法里面事务,如果add方法本身没有事务,调用update方法之后,创建新事务

          • REQUIRED_NEW:当前的方法必须启动新事务,并在它的事务内运行,如果有事务正在运行,应该将它挂起。

            [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kQ3eSjND-1599004849816)(C:\Users\Administrator\Desktop\尚硅谷Spring5教程资料\笔记\笔记\分析图\事务\事务传播行为.bmp)]
            @Transactional(propagation = Propagation.REQUIRES_NEW)

      • ioslation: 事务隔离级别
        (1).事务有特性成为隔离性,多事务操作之间不会产生影响,不考虑隔离性产生跟多问题。

        (2).有三个问题:脏读、不可重复读、虚(幻)读

        • 脏读:一个未提交事务读取到另一个未提交事务的数据

        • 不可重复读:一个未提交事务读取到另一个提交事务

        • 幻读:一个未提交事务读取到另一个提交事务添加的数据

        • 解决:通过设置事务隔离性级别,解决读问题

      • timeout:超时时间

        • 事务需要在一定时间内进行提交,如果不提交进行回滚
        • 默认值是-1,设置时间以秒单位进行计算
      • readOnly: 是否只读

        • 读:查询操作 ,写:添加修改删除操作
        • readOnly默认值false,表示可以查询,可以添加修改删除操作
        • 设置readOnly 值是true,设置true之后,只能查询
      • rollbackFor:回滚

        • 设置查询那些异常进行事务回滚
      • noRollbackFor: 不回滚

        • 设置出现那些异常不进行事务回滚
  8. 事务操作(xml声明式事务管理)

    • 在spring配置文件中进行配置

          <!--配置通知-->
          <tx:advice id="txadvice">
              <!--配置事务参数-->
              <tx:attributes>
                  <!--指定那种规则的方法上面添加事务-->
                  <tx:method name="accountMoney" propagation="REQUIRED"/>
      <!--            <tx:method name="account*"></tx:method>-->
      
              </tx:attributes>
          </tx:advice>
      
    • 配置通知

          <!--配置通知-->
          <tx:advice id="txadvice">
              <!--配置事务参数-->
              <tx:attributes>
                  <!--指定那种规则的方法上面添加事务-->
                  <tx:method name="accountMoney" propagation="REQUIRED"/>
      <!--            <tx:method name="account*"></tx:method>-->
      
              </tx:attributes>
          </tx:advice>
      
    • 配置切入点和切面

      <!--配置切入点和切面-->
      <aop:config>
          <!--配置切入点-->
          <aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..)"/>
          <!--配置切面-->
          <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
      </aop:config>
      
  9. 事务操作(完全注解声明事务管理)

    • 创建配置类,使用配置类替代xml配置文件

      @Configuration  //配置类
      @ComponentScan(basePackages = "com.atguigu") //组件扫描
      @EnableTransactionManagement //开启事务
      
      public class TxConfig {
      
          //创建数据连接池
          @Bean
          public DruidDataSource getDruidDataSource() {
              DruidDataSource dataSource = new DruidDataSource();
              dataSource.setDriverClassName("com.mysql.jdbc.Driver");
              dataSource.setUrl("jdbc:mysql://ip/user_db");
              dataSource.setName("root");
              dataSource.setPassword("root");
              return dataSource;
          }
      
          //创建JdbcTemplate对象
          @Bean
          public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
              JdbcTemplate jdbcTemplate = new JdbcTemplate();
              // 注入dataSource
              jdbcTemplate.setDataSource(dataSource);
              return  jdbcTemplate;
          }
      
      
          //创建事务管理器
          @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、付费专栏及课程。

余额充值