Spring-事务

Spring 事务

事务的基本概念

🔹 什么是事务?

事务是一组数据库操作 ,它们作为一个整体,要么全部成功 ,要么全部回滚。 常见的事务场景:

  • 银行转账(扣款和存款必须同时成功)

  • 订单系统(创建订单和扣减库存必须同时成功)

🔹 事务的四大特性(ACID)

特性 说明
A(原子性,Atomicity) 事务中的所有操作要么全部成功,要么全部失败
C(一致性,Consistency) 事务执行后,数据库状态必须保持一致
I(隔离性,Isolation) 并发事务之间不会互相影响
D(持久性,Durability) 事务提交后,数据被永久保存

事务分为两种:

声明式事务:

使用Spring的@Transactional注解来管理事务

name"error" 时,抛出异常,事务回滚,数据不会被插入数据库

name"John" 时,正常插入数据,事务提交。

编程式事务:

需要手动控制的事务

事务控制的步骤

  1. 配置数据库连接

  2. 将食物管理器加尔uioc容器,并将数据库连接的对象传入事务管理器

  3. 在配置类上方写上@EnableTransactionManagement注解,表示开启事务管理

  4. 在要开启事务的方法上写@Transactional注解

事务的属性

1.只读readonly

设置方式:在@Transactional注解中加上属性readOnly,设置为true,即此方法的事务操作为只读模式,如果有DML的语句,就会报错。

防止误修改数据 :如果在 readOnly = true 的事务中尝试修改数据,可能会抛出异常(取决于数据库)。

适用于只读操作 :如 查询数据 ,但不涉及 插入、更新、删除 操作。

2.时间超时timeout

设置方式: 在@Transactional注解中加上属性timeout = xx ,此时事务若长时间占用资源,会自动回滚

3.rollbackFor

@Transactional(rollback = Exception.class)用于指定哪写异常需要回滚

3.noRollbackFor

@Transactional(rollback = Exception.class)用于指定哪写异常不需要回滚

4.Isolation Level

隔离级别有四种

1.READ_UNCOMMITTED(允许脏读)

修改表数据,即使事务未提交也可以查询到修改数据(脏读)

2.READ_COMMITTED

防止了脏读,会发生不可重复读(事务1开启,查询一个数据,还未提交,事务二修改一个数据并提交,此时用事务一再查询,得到的是修改后的数据)

3.REPEATABLE_READ

防止了不可重复读,可能发生幻读(和不可重复读类似,但不可重复读是数据修改,幻读是新增或删除数据)

4.SERIALIZABLE

此为做高级别,可以防止以上全部情况

推荐 READ_COMMITTED 作为默认隔离级别(防止脏读,性能较好)。

对于高并发场景(如库存管理),建议 REPEATABLE_READ,防止不可重复读。

对于金融级别的事务(如转账),使用 SERIALIZABLE,确保数据一致性(但性能较差)。

避免 READ_UNCOMMITTED,因为它可能导致数据不一致问题。

propagation传播

名称 含义
REQUIRED(默认值) 如果父方法有事务,就加入,如果没有就新建,自己独立
REQUIRES_NEW 不管父方法是否有事务,我都新建事务,都是独立的
相关推荐
一定要AK1 小时前
Spring 入门核心笔记
java·笔记·spring
科技小花1 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸1 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
凯尔萨厮1 小时前
创建SpringWeb项目(Spring2.0)
spring·mvc·mybatis
D4c-lovetrain1 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希2 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神2 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员2 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java2 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿3 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb