1、事务传播机制
2、事务隔离机制
3、只读
4、事务超时
5、回滚规则
Spring事务传播机制
事务的特性:
A原子性:要么全部成功,要么全部失败
C一致性:一旦事务完成,就必须保证业务处于一致的状态,不能部分成功部分失败,确保完整性
I隔离性:很多事务处理相同数据时,应该隔离开,防止数据被破坏
D永久性:一旦事务完成,就会被永久保存到数据库,及时系统损坏,也不会丢失数据
Spring事务的配置方式
1、编程式事务管理:Spring推荐使用TranscationTemplate
2、声明式事务管理:声明式事务管理是建立在AOP上的,其本质是在方法前后进行拦截,在目标方法开始前创建或加入一个事务,执行完成后提交或回滚
编程式事务管理要单独实现,当业务量大功能复杂时,使用编程式事务是很复杂的。声明式事务属于无侵入式,不影响业务逻辑,只需在配置文件中声明或通过注解配置便可以将事务规则应用到业务中。声明式事务的粒度到方法级别,编程式事务的粒度是到代码块的,但是可以通过提取方法的方式完成声明式事务的配置。
事务的传播机制:
@Transactional(propagation=Propagation.REQUIRED)
一般用在事务嵌套的场景,比如一个事务内调用了另一个事务,是两个事务方法独立提交还是合并到外层事务一起提交,这就需要配置事务传播机制来决定如何执行。
PROPAGATION_REQUIRED:Spring的默认传播机制,如果有外层事务,则加入外层事务,一起提交,一起回滚,如果没有外层事务,则新建一个外层事务。
PROPAGATION_REQUES_NEW:新建一个外层事务,同时将外层事务挂起,当前事务执行完毕,恢复上层事务。
PROPAGATION_SUPPORT:加入外层事务,如果没有外层事务,则以非事务的方式执行,完全依赖外层事务。
PROPAGATION_NOT_SUPPORT:不支持事务,如果有外层事务则挂起,执行完当前代码则恢复事务,无论是否失败都不回滚。
PROPAGATION_NEVER
PROPAGATION_MANDATORY
PROPAGATION_NESTED
事务的隔离级别:
@Transactional(isolation = Isolation.READ_UNCOMMITTED)
多个事务操作同一个数据容易导致以下问题:
脏读:读取未提交的数据
不可重复读:两次或两次以上的查询结果不同,在两次查询之间发生了数据修改
幻读:和不可重复读相似,在T1事务读取几行后T2事务增加或删除了记录导致T1读取的数据增加或减少了
隔离级别:
ISOLATION_DEFAULT:数据库后端默认级别
ISOLATION_READ_UNCOMMITTED:读未提交
ISOLATION_READ_COMMITTED:读已提交,oracle默认隔离级别
ISOLATION_REPEATABLE_READ:可重复读,MySql默认级别
ISOLATION_SERIALIZABLE:完全服从ACID隔离级别,不会发生脏读,幻读,不可重复读,但是最慢
只读
@Transactional(readOnly=true)
如果一个事务只对数据库进行读操作,那么数据库可以利用只读的特性采取优化措施
事务超时
@Transactional(timeout=30)
事务不能执行过长时间否则会占用数据库资源,应该设置特定时间让事务自动回滚,不必等它自己结束。
回滚规则
@Transactional(rollbackFor=RuntimeException.class)
事务一般在运行时异常回滚,在受检查异常不回滚,可以声明运行时异常不回滚也可以声明受检查异常回滚