文章目录
Spring-tx事务管理
1.事务的概念:
事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起 向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合。
2.事务的分类1
- 编程式事务
编程式事务是指手动编写程序来管理事务,即通过编写代码的方式直接控制事务的提交和回滚。在 Java 中,通常使用事务管理器(如 Spring 中的 PlatformTransactionManager
)来实现编程式事务。
编程式事务的主要优点是灵活性高,可以按照自己的需求来控制事务的粒度、模式等等。但是,编写大量的事务控制代码容易出现问题,对代码的可读性和可维护性有一定影响
- 声明式事务
声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。
开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作!
使用声明式事务可以将事务的控制和业务逻辑分离开来,提高代码的可读性和可维护性。
3.事务具有4个基本特性:
- 原子性:一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
- 一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
- 隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性:持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。
4.事务隔离级别
(1)为什么要事务隔离2
-
更新丢失
两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发并没有被隔离开来。
-
脏读
对于两个事务T1,T2,T1读取了已经被T2更新但还没有提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
-
不可重复读
对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不一样了。
-
幻读
对于两个事务T1,T2,T1从一个表中读取了字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。
(2)Spring事务隔离级别
隔离级别由低到高: 读未提交=>读已提交=>可重复读=>序列化操作
隔离级别 | 说明 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
ISOLATION_DEFAULT | spring默认数据库的隔离级别 | – | – | – |
ISOLATION_READ_UNCOMMITTED | 读未提交 | √ | √ | √ |
ISOLATION_READ_COMMITTED | 读已提交 | × | √ | √ |
ISOLATION_REPEATABLE_READ | 可重复读 | × | × | √ |
ISOLATION_SERIALIZABLE | 序列化操作 | × | × | × |
5.事务传播行为
传播行为 | 说明 |
---|---|
REQUIRED【默认】 | 当前如果有事务,Spring就会使用该事务;否则会开始一个新事务(增、删、改) |
SUPPORTS | 当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务(查询) |
MANDATORY | 当前如果有事务,Spring就会使用该事务;否则会抛出异常 |
REQUIRES_NEW | 当前如果有事务,把当前事务挂起,新建事务 |
NOT_SUPPORTED | 当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则该事务挂起 |
NEVER | 当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常 |
NESTED | 当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与REQUIRED一样 |
6.事务的应用
添加事务
@Transactional()
位置:方法/类
方法:当前方法有事务
类上:类下所有方法都有事务
1.只读模式readOnly
只读模式可以提升查询事务的效率! 推荐事务中只有查询代码,使用只读模式
默认: boolean readOnly() default false
解释:一般情况下,都是通过类添加注释添加事务!
类下的所有方法都有事务
查询方法可以通过再次添加注释,设置只读模式,提升效率!
2.超出时间timeout
默认:永远不超时 -1
设置 timeout = 时间 秒数 超出时间,就会回滚事务和释放异常
在类上设置事务属性,方法也设置了事务注解! 方法会不会生效
不会生效: 方法上的注解覆盖了类上的注解
3.指定异常回滚和指定异常不会滚:rollbackFor/noRollbackFor
默认情况下,指定发生运行是异常事务才会回滚
我们可以指定Exception异常来控制所有异常来回滚!
rollbackFor = Exception.class
noRollbackFor = 回滚异常范围内,控制某个异常不会回滚
4.隔离级别设置isolation
推荐设置第二个隔离级别 读已提交 isolation = Isolation.READ_COMMITTED