Spring事务
l
什么是Spring事务?
Spring 事务是在数据库事务的基础上进行封装扩展:
- 支持原有的数据库事务的隔离级别,加入了事务传播的概念
- 提供多个事务的合并或隔离的功能
- 提供声明式事务(@Transactional),让业务代码与事务分离,减少代码侵入,事务变得更易用 (AOP)
总的来说就是能够更加简便的管理事务,不管是不同方法公用同一个事务或者是不同方法有自己的事务
Spring事务应用
Spring事务管理类型
编程式事务
通过 TransactionTemplate
或者TransactionManager
手动管理事务,实际应用中很少使用
声明式事务
标注@Transactional注解
Spring事务属性TransactionDefinition
隔离级别(Isolation Level)
和数据库的隔离级别基本一样
- DEFAULT:使用数据库默认的隔离级别。
- READ_UNCOMMITTED:允许读取未提交的数据。
- READ_COMMITTED:只允许读取已提交的数据。
- REPEATABLE_READ:确保多次读取的结果是一致的。
- SERIALIZABLE:提供严格的事务隔离,以避免幻读。
传播行为(Propagation Behavior)
传播行为定义了事务的边界,那调用链中的子方法,是用一个新事务,还是使用当前事务呢?
这里假设A方法调用B方法
- REQUIRED(默认常用):A方法和B方法共用同一个事务
- MANDATORY:A方法没有事务则抛出异常,否则A方法和B方法共用同一个事务
- REQUIRES_NEW(操作的独立性):B方法自己新建一个事务,共两个事务,A方法异常不会影响B方法
- NESTED(允许只回滚B方法事务):B方法自己新建一个事务,共两个事务,A方法异常会影响B方法
不常用
- SUPPORTS:如果A方法存在事务,则B方法加入该事务,如果A方法没有事务则以非事务方式执行
- NOT_SUPPORTED:以非事务方式执行
- NEVER:以非事务方式执行,如果存在事务则抛出异常
1 |
|
只读标志(Read-Only Flag)
只读标志可以帮助数据库优化事务,如果所有的数据操作都是读取操作,则可以将事务标记为只读。
超时设置(Timeout)
超时设置定义了事务的最长运行时间,如果超出这个时间,则事务会被回滚。
回滚异常类型(rollbackFor)
可以自定义哪些异常需要被捕捉然后回滚代码。
Spring事务失效
- 非public方法上使用@Transactional
- 非事务方法调用事务方法
- 数据库或数据库引擎不支持事务
Spring事务原理
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 白兰!