Spring框架事务操作

事务概念

  1. 什么是事务

    1. 事务是数据库操作最基本的单元,逻辑上一组操作,要么都成功,如果有一个失败则都失败
    2. 典型场景,银行转账

      *lucy转账100元给mary

      *lucy少了100,mary多100.

  2. 事务的四大特性(ACID)

    1. 原子性
    2. 一致性
    3. 隔离性
    4. 持久性
  3. 事务操作(Spring事务管理介绍)

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

    1. 在Spring配置文件配置事务管理器
          <!--创建事务管理器-->
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dateSource"></property>
          </bean>
      
    2. 在Spring配置文件中引入名称空间tx
    3. 开启事务注解
          <!--开启事务注解-->
          <tx:annotation-driven transaction-manager="transactionManger"></tx:annotation-driven>
      
    4. 在service类上面添加事务注解
      1. @Transactional,这个注解添加到类上面,也可以添加方法上面
      2. 如果把这个注解添加类上面,这个类里面所有的方法都添加事务
      3. 如果把这个注解添加到方法上面则,为这个方法添加事务
  5. 事务操作(声明式事务管理参数配置)

    1. 在service类上面添加注解@Transactional在这个注解中可以配置事务相关参数

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0BI8kDaQ-1638845021752)(C:\Users\Master\AppData\Roaming\Typora\typora-user-images\image-20211205153716106.png)]

    2. propagation:事务传播行为

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

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9odq48r-1638845021753)(C:\Users\Master\AppData\Roaming\Typora\typora-user-images\image-20211205162639283.png)]

        @Service
        @Transactional(propagation = Propagation.REQUIRED)
        public class MoneyService {
        
    3. ioslation:事务隔离级别

      1. 事务里面有特性,称为隔离性,多事务操作之前不会产生影响,不考虑隔离性会产生很多问题

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

      3. 脏读:一个未提交的事务,读取到了另一个未提交事务的数据

      4. 不可重复读:一个未提交事务,读取到了另一个提交事务修改数据

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

      6. 通过设置事务的隔离性,就可以解决读的问题

        image-20211205172420640
        @Service
        @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ)
        public class MoneyService {
        
    4. timeout:超时时间

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

      1. 读:查询操作,写:添加修改删除,操作
      2. readOnly默认值为false,表示可以查询,可以添加修改删除操作
      3. 设置readOnly值为true,设置为true后只能查询
    6. rollbackFor:回滚

      • 设置出现哪些异常进行事务回滚
    7. noRollbackFor:不回滚

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

    1. 在spring配置文件中进行配置
      • 配置事务管理器

      •     <!--创建事务管理器-->
            <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
                <property name="dataSource" ref="dateSource"></property>
            </bean>
        
      • 配置通知,

            <!--配置通知-->
            <tx:advice id="txadvice">
                <tx:attributes>
                    <tx:method name="accountMoney" propagation="REQUIRED"/>
                </tx:attributes>
            </tx:advice>
        
      • 配置切入点和切面

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

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

        @Configuration
        @ComponentScan(basePackages = "com.dxz.demo")//组件扫描
        @EnableTransactionManagement//开启事务
        public class Config {
        
      2. 然后配置数据池

            @Bean
            public DruidDataSource getDruidDataSource(){
                DruidDataSource druidDataSource = new DruidDataSource();
                druidDataSource.setUrl("jdbc:mysql://localhost:3306/dxz?characterEncoding=utf8");
                druidDataSource.setDriverClassName("com.mysql.jdbc.Driver");
                druidDataSource.setUsername("root");
                druidDataSource.setPassword("DXZDXZ4811");
                return druidDataSource;
            }
        
      3. 然后创建JdbcTemplate对象

            @Bean
            public JdbcTemplate getJdbcTemplate(DataSource dataSource){
                JdbcTemplate jdbcTemplate = new JdbcTemplate();
                jdbcTemplate.setDataSource(dataSource);
                return jdbcTemplate;
            }
        
      4. 创建事务管理器

            @Bean
            public DataSourceTransactionManager getManager(DataSource dataSource){
                DataSourceTransactionManager manager = new DataSourceTransactionManager();
                manager.setDataSource(dataSource);
                return manager;
            }
        
      5. 测试类,context获取方法改变了

            @Test
            public void testMoney(){
                ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
                MoneyService moneyService = context.getBean("moneyService",MoneyService.class);
                moneyService.exchange();
            }
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

躺平崽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值