当前位置: 首页 > news >正文

Spring的事务管理机制

Spring的事务管理机制

事务是一组操作的集合,是一个不可分割的操作。事务会将所有的操作视为一个整体向系统提交或撤销操作请求,这一组操作集合要么全部成功,妖媚全部失败。

Spring声明式事务@Transactional

Spring中也为事务提供了支持,通过@Transactional注解在方法执行前自动开启事务,方法执行完毕之后自动提交事务。如果这个方法在执行过程中出现异常就会自动进行事务的回滚。

@Transactional

  • 可以用来修饰方法或类。@Transactional注解默认只对public方法生效,这是由于Spring的事务管理是基于动态代理1现的

为了更好的观察Spring事务管理相关信息,我们可以在application.yml配置文件中开启事务管理日志,观察其日志信息。

#spring 事务管理日志
logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debug

访问对应接口,如下:

@Service
@Slf4j
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Transactional //开启Spring的事务管理@Overridepublic void save(User user) {log.info("[UserService#save]: 开始执行");userMapper.insert(user);log.info("[UserService#save]: 结束执行");}
}

观察控制台输出日志,如下:

  • 程序正常运行结束

在这里插入图片描述

观察数据库,数据正确插入:

在这里插入图片描述

  • 程序异常结束

在这里插入图片描述

观察数据库,数据回滚没有保存到数据库中:

在这里插入图片描述

@Transactional常见的三个属性

  1. rollbackFor:异常回滚属性,指定能够出发事务回滚的异常类型。

  2. isolation:控制事务的隔离级别,默认隔离级别为Isolation.DEFAULT

  3. propagation:事务的传播机制,默认传播行为为Propagation.REQUIRED

rollbackFor

我们知道通过@Transactional注解进行事务管理时,当该方法发生异常时会执行rollback回滚操作,那么是不是什么类型的异常都会执行rollback操作呢?

如果不进行显示指定,默认情况下只有出现RuntimeException及其子类和Error及其子类才会回滚事务。

//如果还需要指定对特定异常的回滚,可以通过rollbackFor属性进行指定
@Transactional(rollbackFor = [...])

isolation

SQL标准定义了四种隔离级别:

隔离级别解释
READ UNCOMMITTED读未提交,该隔离级别可以看到其他事务中未提交的数据(脏读问题
READ COMMITTED读已提交,该隔离级别可以看到其他事务中已提交的数据(由于事务的执行中可能有多个事务提交,所以可能出现不可重复读问题
REPEATABLE READ可重复读,该隔离级别可能出现幻读问题
SERIALIZABLE串行化

在Spring事务中提供了五种隔离级别来支持sql标准的隔离级别:

spring提供的事务隔离级别解释
Isolation.DEFAULT以连接的数据库的事务隔离级别为主
Isolation.READ_UNCOMMITTED读未提交
Isolation.READ_COMMITTED读已提交
Isolation.REPEATABLE_READ可重复读
Isolation.SERIALIZABLE串行化

我们可以通过isolation属性进行设置

@Transactional(isolation = ...)

propagation

通过这个属性我们可以配置事务的传播行为,即当一个事务方法被另一个调用时,这个事务方法如何进行事务控制。

在这里插入图片描述

在这里插入图片描述

常见的事务传播行为:

属性值含义
Propagation.REQUIRED默认的事务传播级别,需要事务,有则加入,无则创建新事务
Propagation.REQUIRES_NEW需要新事务,无论有无,总是创建新事务
Propagation.SUPPORTS支持事务,有则加入,无则在无事务状态中运行
Propagation.NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
Propagation.MANDATORY必须有事务,否则抛异常
Propagation.NEVER必须没事务,否则抛异常
Propagation.NESTED如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行。如果当前无事务,则创建新事物

  1. 动态代理是通过创建代理对象来拦截对目标对象的方法调用。代理对象只能调用目标对象的公共方法(因为代理对象通常是一个新生成的类,它要么实现了和目标对象相同的接口(JDK动态代理),要么是目标对象的子类(CGLIB代理))。对于非公共方法,代理对象无法直接调用,因为它们在外部不可见。 ↩︎

http://www.dtcms.com/a/430897.html

相关文章:

  • DAY22 XML、XML解析
  • Lazygi - 让git操作不再困难
  • sns社交网站建设东莞服务36招
  • 有那些方法推广网站可用的在线网页代理
  • 一种基于模型残差的密度聚类方法之二(电力线分股)
  • 基于Keil下多文件打包生成LIB库的具体步骤
  • php网站开发教学购物软件哪个更好更便宜
  • 中小企业网站开发长期做网站应该购买稳定的空间
  • 二叉树的递归层序遍历
  • 牛客算法基础noob58 无限长正整数排列字符串
  • ECharts 配置语法详解
  • 哪个网站做自媒体比较好华为网站建设的目标是否明确
  • 【机器学习】 在Jupyter Notebook 中如何指定Python环境
  • springboot海洋馆预约系统的设计与实现(代码+数据库+LW)
  • 精通C语言(1.内存函数)
  • Radio Garden官网入口 - 全球广播电台在线收听网站|网页版|打不开
  • 基于以太坊的Dao治理系统
  • 【LeetCode_203】移除链表元素
  • LeetCode刷题记录----75.颜色分类
  • QQ可以在网站做临时会话么温州的网站建设公司
  • Java-Spring 入门指南(十七)SpringMVC--Apipostl与RestFul实战测试
  • Codeforces Round 993A Easy Problem
  • OSI模型、网络地址、与协议
  • Codeforces Round 993B. Normal Problem
  • 《嵌入式 – GD32开发实战指南(RISC-V版本)》第3章 GPIO流水灯的前世今生
  • 深圳手机网站建设哪家好表白链接生成器
  • GameObject 常见类型详解 -- 光环生成对象(AURA GENERATOR)
  • 29.CSS 3D 加载转轮 | CSS 动画效果
  • 潍坊制作网站用淘宝做公司网站
  • AMQP协议深度解析:消息队列背后的通信魔法