Spring中的@Transactional的工作原理
作者:兴涛
这篇文章主要介绍了Spring中的@Transactional的工作原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
1、原理
事务的概念想必大家都很清楚,其ACID特性在开发过程中占有重要的地位。同时在并发过程中会出现一些一致性问题,为了解决一致性问题,也出现了四种隔离级别,这里就不再详述了,感兴趣的可以去查一下。下面我们讨论一下Spring中的事务。
Spring中的事务有两种:
- 编程式事务
- 声明式事务
通常情况下我们使用声明式事务,它是基于SpringAOP实现的。基于AOP实现的事务极大得帮助了我们的开发效率,其本质是对方法进行前后拦截,在目标方法前加入一个事务,在目标完成后再加入一个事务进行提交或者回滚,这种方式下我们并不需要在目标方法中的代码中掺杂事务管理代码,轻松进行事务管理。
而编程式事务就需要我们修改代码来进行事务管理。这种方法看似很麻烦,但是它的存在自有它的道理,上面我们讲到的声明式事务控制,其控制的细粒度只能作用到方法上,无法在代码块中实现声明式事务控制。我们都知道,一旦加上事务,程序的运行效率就会降低,所以编程式事务也有它的用武之地。
但是我们的广大劳动人民也是智慧的。直接将需要事务的代码块独立成方法,这样仍然可以使用声明式事务。当然在开发中具体情况要具体分析了。
2、用法
事务的传播行为:
事务的隔离级别:
@Transactional属性
示例代码:
@Service @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class) public class RoleServiceImpl implements RoleService { @Autowired private RoleDao roleDao; @Transactional(propagation = Propagation.SUPPORTS,readOnly = true) @Override public List<Role> findAllRoles() { return roleDao.selectAllRoles(); } }
3、拓展
1、为什么声明式事务只能应用于方法上?
- 因为声明式事务是基于AOP实现的,AOP是基于动态代理实现的。
- 动态代理只会捕捉来自外部的方法调用,
- 意思就是类内部的方法调用类内部的另外方法,并不会发生事务行为。
到此这篇关于Spring中的@Transactional的工作原理的文章就介绍到这了,更多相关Spring @Transactional 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- 浅谈Spring中@Transactional事务回滚及示例(附源码)
- Spring事务@Transactional注解四种不生效案例场景分析
- springboot编程式事务TransactionTemplate的使用说明
- spring声明式事务@Transactional底层工作原理
- spring中12种@Transactional的失效场景(小结)
- Spring事务处理Transactional,锁同步和并发线程
- 基于Spring中的事务@Transactional细节与易错点、幻读
- spring声明式事务 @Transactional 不回滚的多种情况以及解决方案
- Spring Transaction事务实现流程源码解析