栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring声明式事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring声明式事务

回顾事务

事物的四大特征(ACID)

  •  原子性
  • 一致性
  • 隔离性
  • 持久性

事务的三种行为

  • 开启事务 connection.setAutoCommit();    jdbc默认为false
  • 提交事务 connection.commit();
  • 回滚事务: connection rollback();

spring中支持的事务管理

一..编程式事务管理

  1. 获取数据库连接Connection对象

  2. 取消事务的自动提交【开启事务】

  3. 执行操作【核心业务代码】

  4. 正常完成操作时手动提交事务

  5. 执行失败时回滚事务

  6. 关闭相关资源

  • 发现问题:

    • 核心业务代码与事务管理代码【非核心业务】相耦合,导致代码分散及代码混乱问题

  • 解决思路

    • 使用AOP思想【框架】,将事务管理代码先横向提取,再动态织入。【声明式事务管理】

二..声明式事务管理 一句话理解

使用aop框架或者aop思想,将事务管理代码先横向提取,再动态织入

1.带入jar包{aspecJ}



    org.springframework
    spring-aspects
    5.3.1

2.编写配置文件 applicagion 主要配置注解扫描和 数据库链接信息和事务管理配置注解驱动





    

    
    
        
        
        
        
    

    
        
    

    
    
        
    

    


在需要事务的类或者方法上加上注解 

@Transactional

propagation【事务传播行为】

 

解释常用的

 

  第一个REQUIRED   代表 方法2调用方法1时 用方法1的事务 如果方法1没有事务就自己创建一个事务

 

 

第二个 REQUIRES_NEW

代表当前的方法必须启动新的事务 如果调用别的方法时会把调用的方法的事务挂起

 

其他事务传播行为

传播属性描述
REQUIRED如果有事务在运行,当前的方法就在这个事务内运行;否则就启动一个新的事务,并在自己的新事务内运行。
REQUIRES_NEW当前的方法*必须*启动新事务,并在自己的事务内运行;如果之前有事务正在运行,应该将它挂起。
SUPPORTS如果有事务在运行,当前的方法就在这个事务内运行,否则可以不运行在事务中。
NOT_SUPPORTED当前的方法不应该运行在事务中,如果有运行的事务将它挂起
MANDATORY当前的方法必须运行在事务中,如果没有正在运行的事务就抛出异常。
NEVER当前的方法不应该运行在事务中,如果有正在运行的事务就抛出异常。
NESTED如果有事务正在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则就启动一个新的事务,并在它自己的事务内运行。
案例
@Transactional(propagation = Propagation.REQUIRED)
    public void purchase(String username, String isbn) {
        //查询book价格
        Integer price = bookShopDao.findBookPriceByIsbn(isbn);
        //修改库存
        bookShopDao.updateBookStock(isbn);
        //修改余额
        bookShopDao.updateUserAccount(username, price);
    }

 @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void purchase(String username, String isbn) {
        //查询book价格
        Integer price = bookShopDao.findBookPriceByIsbn(isbn);
        //修改库存
        bookShopDao.updateBookStock(isbn);
        //修改余额
        bookShopDao.updateUserAccount(username, price);
    }

事物的隔离级别

isolation【事务隔离级别】 

 

    • 概述:事务隔离级别就是事务与事务之间隔离等级

    • 隔离级别如下

      • READ UNCOMMITTED【读未提交】:1

      • READ COMMITTED【读已提交】:2

      • REPEATABLE READ【可重复读】:4

      • SERIALIZABLE【串行化】:8

    • Oracle与Mysql隔离级别对比

      OracleMySQL
      READ UNCOMMITTED×
      READ COMMITTED√(默认)
      REPEATABLE READ×√(默认)
      SERIALIZABLE
    • 不同隔离级别可能出现现象

       

  • timeout【事务超时】

    • 设置事务超时的强制回滚时间

    • 类型:int,单位:秒

    • 默认值:-1

  • readonly【事务只读】

    • 默认值:false

    • 设置当前事务是否只读

    • 一般查询数据时,设置事务只读,提高一点性能

    • 如增删改操作中设置只读,会报如下错误

      • Connection is read-only. Queries leading to data modification are not allowed

  • rollbackFor|noRollbackFor【事务(是否)异常回滚】

    • rollbackFor:设置回滚的指定异常Class

    • noRollbackFor:设置不回滚的指定异常Class

  •  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/838126.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号