Spring中的@Transactional的工作原理

作者:兴涛 时间:2023-08-06 02:00:04 

1、原理

事务的概念想必大家都很清楚,其ACID特性在开发过程中占有重要的地位。同时在并发过程中会出现一些一致性问题,为了解决一致性问题,也出现了四种隔离级别,这里就不再详述了,感兴趣的可以去查一下。下面我们讨论一下Spring中的事务。

Spring中的事务有两种:

  • 编程式事务

  • 声明式事务

通常情况下我们使用声明式事务,它是基于SpringAOP实现的。基于AOP实现的事务极大得帮助了我们的开发效率,其本质是对方法进行前后拦截,在目标方法前加入一个事务,在目标完成后再加入一个事务进行提交或者回滚,这种方式下我们并不需要在目标方法中的代码中掺杂事务管理代码,轻松进行事务管理。

而编程式事务就需要我们修改代码来进行事务管理。这种方法看似很麻烦,但是它的存在自有它的道理,上面我们讲到的声明式事务控制,其控制的细粒度只能作用到方法上,无法在代码块中实现声明式事务控制。我们都知道,一旦加上事务,程序的运行效率就会降低,所以编程式事务也有它的用武之地。

但是我们的广大劳动人民也是智慧的。直接将需要事务的代码块独立成方法,这样仍然可以使用声明式事务。当然在开发中具体情况要具体分析了。

2、用法

事务的传播行为: 

Spring中的@Transactional的工作原理

 事务的隔离级别

Spring中的@Transactional的工作原理

@Transactional属性

Spring中的@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是基于 * 实现的。

  • * 只会捕捉来自外部的方法调用,

  • 意思就是类内部的方法调用类内部的另外方法,并不会发生事务行为。

来源:https://juejin.cn/post/7104448339017793544

标签:Spring,@Transactional
0
投稿

猜你喜欢

  • java实现ftp上传 如何创建文件夹

    2021-06-10 10:49:17
  • C# 汉字与拼音互转的实现示例

    2022-03-06 06:50:20
  • android 7自定义相机预览及拍照功能

    2023-01-29 06:56:34
  • springboot实现基于aop的切面日志

    2022-09-09 11:53:11
  • C# string格式的日期时间字符串转为DateTime类型的方法

    2022-04-07 09:34:30
  • spring cloud将spring boot服务注册到Eureka Server上的方法

    2023-12-08 19:42:09
  • 基于C#实现的端口扫描器实例代码

    2022-04-29 20:21:56
  • C#字符串如何提取数值(带小数点)

    2023-01-27 06:10:25
  • 关于Spring BeanPostProcessor的执行顺序

    2022-03-17 23:53:41
  • 深入理解Java注解类型(@Annotation)

    2022-11-14 17:28:42
  • 浅析Spring工厂的反射和配置文件

    2023-06-22 20:52:23
  • Android checkbox的listView具体操作方法

    2023-10-10 06:58:33
  • Java 二分查找算法的实现

    2022-07-23 11:10:13
  • android自定义进度条渐变圆形

    2022-07-15 02:04:14
  • Android序列化接口Parcelable与Serializable接口对比

    2023-03-24 17:48:59
  • C++如何调用已经写好的C接口

    2021-10-16 10:16:14
  • spring中的BeanFactory与FactoryBean的讲解

    2023-03-13 11:18:09
  • java中的FileInputStream三种read()函数用法

    2021-10-27 23:01:21
  • C++实现简易反弹小球游戏的示例代码

    2023-06-15 08:18:50
  • C#中32位浮点数Float(Real)一步步按位Bit进行分析

    2023-07-19 16:01:20
  • asp之家 软件编程 m.aspxhome.com