注册网站多久网站实施要求
Spring 事务
事务的基本概念
🔹 什么是事务?
事务是一组数据库操作,它们作为一个整体,要么全部成功,要么全部回滚。 常见的事务场景:
-  
银行转账(扣款和存款必须同时成功)
 -  
订单系统(创建订单和扣减库存必须同时成功)
 
🔹 事务的四大特性(ACID)
| 特性 | 说明 | 
|---|---|
| A(原子性,Atomicity) | 事务中的所有操作要么全部成功,要么全部失败 | 
| C(一致性,Consistency) | 事务执行后,数据库状态必须保持一致 | 
| I(隔离性,Isolation) | 并发事务之间不会互相影响 | 
| D(持久性,Durability) | 事务提交后,数据被永久保存 | 
事务分为两种:
声明式事务:
使用Spring的@Transactional注解来管理事务
当 name 为 "error" 时,抛出异常,事务回滚,数据不会被插入数据库。
当 name 为 "John" 时,正常插入数据,事务提交。
编程式事务:
需要手动控制的事务
事务控制的步骤
配置数据库连接
将食物管理器加尔uioc容器,并将数据库连接的对象传入事务管理器
在配置类上方写上
@EnableTransactionManagement注解,表示开启事务管理在要开启事务的方法上写
@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 | 不管父方法是否有事务,我都新建事务,都是独立的 | 

