JTA 只适用于单个服务内吗?

来源:6-3 spring分布式事务实现_不使用JTA

Yoooshiki

2019-03-04

老师您好,在课程的 《4-7 外部事物与JTA》 这一节,有关 JTA事务管理的用途 中,您提到了:

在所谓的分布式系统,去实现分布式事务的时候,其实我们最终要考虑的就是一个 Java 服务访问多个数据源的时候,怎样保证满足事务性。那这样的话,不管我有多少个服务、多少个数据库、多少个数据资源,我同时访问,都能够满足我这个所谓的分布式事务。
所以,在解决分布式系统事务问题的时候,最基本的问题就是解决一个服务访问多个数据源这么一个问题。

其实当时我没理解这句话,但是不管怎么说,先记下来再说。
然后,我就在 《6-3 spring分布式事务实现_不使用JTA》 这一节中,看到您提到了:

JTA 性能最差、只适用于单个服务之内

只适用于单个服务之内,我该如何理解这两段内容呢?

写回答

2回答

大漠风

2019-03-09

一般说的分布式事务,有两个层次,第1个就是,在一个服务访问多个数据源的时候,数据一致性的问题。也就是说,在一个事务当中,要访问两个数据源,第1个数据源的事务提交了,但是在第2个数据源的事务提交的时候出错,这个时候第1个数据源已经提交的事务是没有办法回滚的。
第2个层次就是,这个服务在进行分布式部署,也就是部署了多个实例的时候,他们之间共同访问这些多个数据源的时候,要保证数据一致性的问题。
一般情况下,由于数据库的事务的隔离机制,那么在并发访问的时候,基本上,我们就可以通过事务来保证他们之间相互不会产生影响。但是对于其他的数据源,就需要某种方式,来保证并发访问的时候,相互没有影响。有一些是数据源本身提供的特性,有一些事需要我们在代码里面通过某种方式去保证。
比如说,访问mq,我们不可能同时访问到同一个消息,因为队列里面的消息只能有一个消费者被消费。如果使用redis,那么后提交的更新,会覆盖之前提交的,所以我们需要考虑这个并发访问的问题。

最后,再回到这个jta的问题。因为它是两阶段提交的,那么,我的服务里面访问两个数据库的时候,他两阶段提交,是要把两个数据源的相应数据都锁住,只有在事务完成的时候,才都一起释放。那么这个时候如果我有多个实例,然后并发访问,这个时候这个锁就会产生非常大的影响。因为锁住同一块数据的概率会加大。
所以说,jta事务不适合并发量大的分布式系统,只有那种并发量小,业务复杂,对数据一致性要求很高的分布式系统。

1
1
Yoooshiki
非常感谢!
2019-03-13
共1条回复

大漠风

2019-03-09

还有jta是只适合一个服务有多个数据库类型的数据源的系统,而不一定是单实例的分布式系统。只不过,上面也说明了它的性能问题,它不适合用于处理高并发的分布式系统,所以使用jta的分布式系统,除非是为了高可用,否则的话,只需要部署单个实例。

0
0

分布式事务实践,从原理到实例,解决数据一致性

掌握分布式事务实现技术,是架构师必备技能。

1149 学习 · 153 问题

查看课程