什么是事务
事务(Transaction)是指在数据库管理中,确保数据操作完整性和一致性的最小工作单元。它包含了一系列数据操作的集合,这些操作作为一个整体被执行,要么都执行,要么都不执行。
事务的四大特性
- 原子性(Atomicity): 事务是一个原子操作单元,不允许分割。其对数据的修改要么全都执行,要么全都不执行。如果事务中的某个操作失败,则整个事务回滚。
- 一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态变换到另一个一致性状态。
- 隔离性(Isolation):在并发环境中,一个事务的执行不被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability):一旦事务完成提交,它对数据库的修改是永久性的。
在Spring中如何使用事务
Spring中使用事务,可以通过 XML配置文件实现,也可以通过注解(推荐)的方式实现。
注解方式为例:
1. 在启动类上使用 @EnableTransactionManagement 注解启用事务
@SpringBootApplication
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. 在需要事务的类或方法上使用 @Transactional 注解加上事务
@Service
public class UserServiceImple {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.REQUIRED,
isolation = Isolation.DEFAULT,
readOnly = false,
timeout = 30,
rollbackFor = Exception.class
)
public void createUser(User user) {
userDao.save(user);
}
}
Spring事务注解@Transactional
@Transactional注解是Spring提供的一种声明式事务管理方式。
可以在类或者方法级别使用,表示当前方法或者类中的所有方法都需要在一个事务中执行。如果方法中出现异常,那么事务就会被回滚,否则就会被提交。
@Transactional注解九个属性
- isolation 事务隔离级别,默认为DEFAULT;
- propagation 事务传播机制,默认为REQUIRED;
- readOnly 事务读写性,默认为false;
- rollbackFor 一组异常类,遇到时回滚,默认为{};
- rollbackForClassName 一组异常类名,遇到时回滚,默认为{};
- noRollbackFor 一组异常类,遇到时不回滚,默认为{};
- noRollbackForClassName 一组异常类名,遇到时不回滚,默认为{};
- timeout 超时时间,以秒为单位;
- value 可选的限定描述符,指定使用的事务管理器,默认 transactionManager。
其中事务传播行为与隔离级别是比较常用到的两个概念
Spring事务传播行为
- PROPAGATION_REQUIRED:(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。
- PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建新事务进行执行。
- PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。‘
- PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按 REQUIRED属性执行,创建一个新事务。
- PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
- PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
Spring事务五大隔离级别
- ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
- ISOLATION_READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据。
- ISOLATION_READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已经提交的数据。
- ISOLATION_REPEATABLE_READ:可重复读,在同一个事务内,任意时刻的查询结果都是一致的。
- ISOLATION_SERIALIZABLE:可串行化,所有事务逐个依次执行。