1.事务介绍
事务是应用程序中一系列严密的操作,从操作开始到结束,要么全部成功,要么每个操作的所有更改全部撤回。事务的结束只有两种情况,全部成功执行;操作发生回滚。
2.事务的特性
事务具有四个特性ACID
- 原子性(Atomicity).一个事务是一个不可分割的工作单位,事务中包括的诸多操作要么全做,要么都不做。
- 一致性(Consistency)。事务在数据执行前后保持数据的一致性。
- 隔离性(Isolation)。一个事务的执行不会被其他事务进行干扰,并发执行的各个事务之间是互不干扰的。
- 持久性(Durability)。指事务一旦提交,它对数据库的影响是永久性的。
事务的隔离级别
事务的隔离级别是指若干个事务并发执行时的隔离程度,在此需要先解释几个名词:
脏读:一个事务读取到另一个事务未提交的数据。
不可重复读:一个事务读取到另一个事务已提交update的数据,多次查询结果不一致。
幻读:一个事务读取到另一个事务已提交insert的数据,多次查询结果不一致。
Spring提供了5种隔离级别
- @Transactional(islocation = Isolation.DEFAULT),默认的事务隔离级别,也就是采用数据库的隔离级别。
- @Transactional(islocation = Isolation.READ_UNCOMMITTED),读未提交,允许其他事务读取未提交的数据,会产生脏读,不可重复读,幻读
- @Transactional(islocation = Isolation.READ_COMMITTED),读已提交,允许其他事务读取已修改的数据,会产生不可重复读,幻读
- @Transactional(islocation = Isolation.REPEATABLE_READ),可重复度,会产生幻读
- @Transactional(islocation = Isolation.SERIALIZABLE),串行化,这是最高级别的事务隔离级别,事务按照顺序执行,避免了脏读,不可重复读,幻读。
数据库 | 默认隔离级别 |
---|---|
oracle | READ COMMITTED |
mysql | REPEATABLE-READ |
事务的传播行为
事务的传播行为是指多个事务存在时,Spring处理这些事务的行为,事务的传播行为有如下7种:
- PROPAGATION_REQUIRED ,Spring的默认的事务传播行为,如果当前存在事务,就加入该事务,如果当前没有存在事务,就创建一个新事务
- PROPAGATION_SUPPORTS,如果当前存在事务,就加入该事务,如果当前没有存在事务,就以非事务的方式运行
- PROPAGATION_MANDATORY,如果当前存在事务,就加入该事务,如果当前没有存在事务就抛出异常
- PROPAGATION_REQUIRES_NEW,创建一个新事务,如果当前存在事务,就把当前事务挂起
- PROPAGATION_NOT_SUPPORTED 以非事务的方式执行,如果当前存在事务,就把当前事务挂起
- PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行,如果没有事务等价于PROPAGATION_REQUIRED
- PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常