Spring事务深入理解

JPA(Java Persistence Api)是一个基于ORM(或叫O/R mapping ,对象关系映射)的标准规范,在这个规范中JPA只定义标准规则,不提供实现。Hibernate是JPA规范的一种实现。spring框架中提供Spring Data JPA作为开发者应用Hibernate框架的接口工具;Spring Boot则提供了一款全自动的“自动依赖模块”:spring-boot-starter-data-jpa

Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件中做相关的事务规则声明,另一种是基于@Transactional 注解的方式。
声明式事务(@Transactional)基本原理如下:
1. 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。
2. spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。
事物失效场景:
1. @Transactional 应用在非 public 修饰的方法上;
2. 无事物方法调用有事物方法;
3. 数据库引擎不支持事物;

4. 在被 spring 声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制。一个使用了@Transactional 的方法,如果方法内包含多线程的使用,方法内部出现异常,不会回滚线程中调用方法的事务。

spring事务:
spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁;
spring事务实际使用AOP拦截注解方法,然后使用动态代理处理事务方法,捕获处理过程中的异常,spring事务其实是把异常交给spring处理;
spring事务只有捕获到异常才会终止或回滚,如果你在程序中try/catch后自己处理异常而没有throw,那么事务将不会终止或回滚,失去事务本来的作用;
spring事务总结:
spring事务本质上使用数据库锁;
spring事务只有在方法执行过程中出现异常才会回滚,并且只回滚数据库相关的操作;
对象锁和spring事务的对比:
对象锁可以保证数据一致性和业务逻辑正确性,但不能保证并发性;
spring事务不能严格保证数据一致性和业务逻辑正确性,但具有较好的并发性,因为只锁数据库行数据;
建议:
如果只有insert操作,可以使用事务;
如果涉及update操作但不涉及其他业务逻辑,可以保守使用事务;
如果涉及update操作及其他业务逻辑,慎用事务,
并且数据库查询跟数据库更新之间尽量间隔较短,中间不宜插入太多其他逻辑,减少数据一致性的风险;
对数据一致性要求不高的情况下可以使用事务结合乐观锁,否则建议用锁;
spring事务为什么不能保证数据一致性和业务逻辑正确性:
1.如果事务方法抛异常,此时会回滚数据库操作,但已经执行的其他方法不会回滚,因此无法保证业务逻辑正确性;
2.即使事务方法不抛异常,也不能保证数据一致性(因为事务接口里的数据库操作在整个接口逻辑执行结束后才提交到数据 库,在接口最后提交到数据库的前后很有可能带来数据一致性的问题),从而不能保证业务逻辑正确性;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值