spring事务

spring事务

起男 1,168 2020-07-07

spring事务

特性

  • 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么全部不起作用
  • 一致性(Consistendy):在一个事务执行前和执行后数据库必须处于一致性状态,如果事务成功,那么系统中所有变化将正确的应用,如果出现错误所有变化将自动回滚
  • 隔离性(Isolation):有可能有多个事务同时处理同一个数据,因此每个事务都需要和其他事务隔离开来,保证数据安全
  • 持久性(Durability):一旦事务完成,无论发生什么,它的结果都不应该受到影响,即数据被永久的保存下来

使用方式

编程式事务

  • 编程式事务管理是侵入式事务管理
  • 使用transactionTemplate或使用PlatformTransactionManager

声明式事务

  • 声明式事务建立在aop之上
  • 其本质是对方法进行拦截,在开始之前创建事务,在结束时提交或回滚

传播行为

事务的传播性一般用在事务嵌套的场景,比如一个事务方法里调用另一个事务方法,是各自独立还是内层合并到外层,需要由传播行为决定

行为作用
requiredspring默认的传播机制,如果有外层当前事务加入到外层事务
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设置超时秒数