spring事务
特性
- 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么全部不起作用
- 一致性(Consistendy):在一个事务执行前和执行后数据库必须处于一致性状态,如果事务成功,那么系统中所有变化将正确的应用,如果出现错误所有变化将自动回滚
- 隔离性(Isolation):有可能有多个事务同时处理同一个数据,因此每个事务都需要和其他事务隔离开来,保证数据安全
- 持久性(Durability):一旦事务完成,无论发生什么,它的结果都不应该受到影响,即数据被永久的保存下来
使用方式
编程式事务
- 编程式事务管理是侵入式事务管理
- 使用transactionTemplate或使用PlatformTransactionManager
声明式事务
- 声明式事务建立在aop之上
- 其本质是对方法进行拦截,在开始之前创建事务,在结束时提交或回滚
传播行为
事务的传播性一般用在事务嵌套的场景,比如一个事务方法里调用另一个事务方法,是各自独立还是内层合并到外层,需要由传播行为决定
行为 | 作用 |
---|---|
required | spring默认的传播机制,如果有外层当前事务加入到外层事务 |
supports | 如果有外层使用外层,如果没有外层,则不用事务 |
mandatory | 必须在一个已有的事务中执行,否则抛出异常 |
requires_new | 不管是否存在事务,都创建一个新的事务,挂起原来的,新的执行完毕再执行原来的 |
not_supported | 以非事务方式执行,如果当前存在事务,则把事务挂起 |
never | 以非事务状态允许,否则抛出异常 |
nested | 具有保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚 |
隔离级别
事务的隔离级别定义一个事务可能受其他并发事务影响的程度
级别 | 作用 | 出现问题 |
---|---|---|
default | 使用数据库默认的隔离级别 | |
read_uncommitted | 允许读取尚未提交的数据 | 幻读、不可重复读、脏读 |
read_committed | 读已提交,允许读取一个已提交的事务 | 不可重复读,脏读 |
repeatable_read | 可重复读,对相同字段的多次读取结果是一致的 | 脏读 |
serializable | 串行,完全符合acid |
oracle默认隔离级别为读已提交
mysql默认隔离级别为可重复读
并发引起的三种情况
- 脏读:读取到了一个未提交的数据
- 不可重复读:一个事务相同的两次查询之间,被其他的事务修改了数据
- 幻读:一个事务相同的两次查询之间,被其他事务添加或删除了数据
@Transactional
参数说明
参数名 | 功能描述 |
---|---|
readOnly | 设置当前事务是否为只读 |
rollbackFor | 设置需要进行回滚的异常类数组 |
rollbackForClassName | 设置需要进行回滚的异常名称数组 |
noRollbackFor | 设置不需要进行回滚的异常类数组 |
noRollbackForClassName | 设置不需要进行回滚的异常名称数组 |
propagation | 设置传播行为 |
isolation | 设置隔离级别 |
timeout | 设置超时秒数 |