Spring事务总结-各维度解析和使用说明
2024-02-13 12:00:12
Spring事务总结
1. 什么是事务
事务(Transaction)是数据库领域的一个概念,它是一组原子操作,要么全部执行,要么全部不执行。事务的四大特性也叫 ACID 特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性(Atomicity) 是指事务中所有操作要么全部成功,要么全部失败。也就是说,要么所有的操作都执行,要么所有的操作都不执行。
一致性(Consistency) 是指事务执行前后,数据库必须处于一致的状态。也就是说,事务执行前后,数据库中的数据必须满足业务规则。
隔离性(Isolation) 是指事务与事务之间是相互隔离的,一个事务不会影响另一个事务。也就是说,一个事务对数据库的修改,在另一个事务提交之前是不可见的。
持久性(Durability) 是指一旦事务提交,那么事务对数据库的修改就永久生效,即使系统出现故障,也不会丢失。
2. 如何使用事务
在Spring中,我们可以使用@Transactional
注解来管理事务。该注解可以应用于类或方法。如果应用于类,那么该类中的所有公共方法都将被标记为事务方法;如果应用于方法,那么只有该方法被标记为事务方法。
例如,以下代码演示了如何使用@Transactional
注解来管理事务:
@Transactional
public class UserService {
public void savePerson(Person person) {
// ...
}
}
3. 事务的特性
Spring事务管理提供了以下特性:
-
传播行为(Propagation Behavior) :传播行为决定了事务如何处理嵌套事务。Spring提供了七种传播行为,分别是:
- REQUIRED:如果当前存在事务,则加入该事务;如果当前不存在事务,则创建一个新的事务。
- REQUIRES_NEW:创建一个新的事务,无论当前是否存在事务。
- SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式执行。
- MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
- NEVER:如果当前存在事务,则抛出异常;如果当前不存在事务,则以非事务方式执行。
- NOT_SUPPORTED:创建一个新的非事务,无论当前是否存在事务。
- NESTED:如果当前存在事务,则创建一个新的嵌套事务;如果当前不存在事务,则创建一个新的事务。
-
隔离级别(Isolation Level) :隔离级别决定了事务与事务之间如何隔离。Spring提供了四种隔离级别,分别是:
- READ_UNCOMMITTED:事务可以读取其他事务未提交的数据。
- READ_COMMITTED:事务只能读取其他事务已提交的数据。
- REPEATABLE_READ:事务可以读取其他事务已提交的数据,但不能读取其他事务未提交的数据。
- SERIALIZABLE:事务可以读取其他事务已提交的数据,但不能读取其他事务未提交的数据,也不能读取其他事务正在修改的数据。
-
回滚规则(Rollback Rules) :回滚规则决定了哪些异常会导致事务回滚。Spring提供了以下回滚规则:
- DEFAULT:只有RuntimeException和Error会引起事务回滚。
- NESTED:除了RuntimeException和Error外,任何异常都会引起事务回滚。
- NO:任何异常都不会引起事务回滚。
4. 事务的最佳实践
在使用Spring事务管理时,应遵循以下最佳实践:
- 尽量使用声明式事务管理,即使用
@Transactional
注解来管理事务。 - 避免在事务中执行长时间运行的操作,例如I/O操作或网络操作。
- 避免在事务中修改多个表,尤其是涉及到外键约束的表。
- 尽量使用短事务,即在事务中执行的操作越少越好。
- 避免在事务中嵌套事务,因为嵌套事务会增加事务管理的复杂度。
5. 总结
Spring事务管理是一个强大的工具,可以帮助我们轻松地管理数据库事务。在使用Spring事务管理时,应遵循上述最佳实践,以确保事务的正确性和可靠性。