事务是通过要么都执行要么都不执行的特性来实现原子性。
在Spring中主要通过@Transactional注解来使用事务,实际实现是通过AOP实现以及需要数据库的支持。
在spring中事务主要通过以下3个进行管理
PlatformTransactionManager
:平台事务管理器TransactionDefinition
:事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)TransactionStatus
:事务运行状态,比如是否新事务、是否可以回滚
Spring为所有平台都提供了接口PlatformTransactionManager,该接口定义了getTransaction通过事务定义信息生成事务获取事务状态,commit提交事务,rollback回滚事务。
事务属性有隔离级别、传播行为、回滚规则、是否只读、事务超时5个方面的事务属性。
隔离级别
与数据库隔离级别一致,这里便不多叙述了。
传播行为
事务传播行为是为了解决业务层方法之间相互调用事务问题。
比如说如果我们在a方法中调用了b方法,那么如果b发生了异常需要回滚,怎么让a也跟着回滚呢?
在有了传播行为之后,我们只需要设置@Tranctional(propagation=propagation.PROPAGATION_REQUIRED)
.
当然还有其他事务传播如下
- requires_new: 开启独立事务
- nested: 开启嵌套事务
- mandatory: 有事务加入,没有则回滚
- 等
事务超时
就是设置一个事务所允许执行的最长时间,若超出时间还没有完成,则自动回滚。
事务只读
对于单条数据,没有必要启用事务支持,可是对于多条查询语句,比如统计数量之类的,可能存在前后的sql查询之间发生了改变。
事务回滚
规定哪些异常导致事务回滚(默认运行期异常,Error导致回滚,检查型不回滚)
Ref
- https://github.com/Snailclimb/JavaGuide/blob/master/docs/system-design/framework/spring/Spring%E4%BA%8B%E5%8A%A1%E6%80%BB%E7%BB%93.md