跨表大事务如何优化

来源:2-3 事务原则与实现:JDBC事务(上)

目科将

2020-03-22

现状描述

有三张表, a,b,c, 关系示意如下:

c表

cid c名称 bid
1 c1 1
2 c2 1

b表

bid b名称 aid
1 b1 1
2 b2 1

a表

aid a名称
1 a1
2 a2

现在需要批量增加 a b c三张表的记录,且所有记录要么都成功增加,要么能失败,目前的处理如下伪代码示意

@Transaction(...)
onOneTransaction(){
   batchA();
   foreach to  batchBWithAid();
   foreach to batchCWithBid();
}

问题

现在 C表和B表 都是比较大的表 有1000w量级的记录数, 因为上面三表在一个事务上执行(基于业务上要求要么都成功or失败),导致执行时间比较长,而且因为还有其它业务在单独操作这三张表, 会相互影响, 想问老师这种情况该怎么优化,有没有好的建议

写回答

1回答

大漠风

2020-05-11

不好意思,前段时间在家办公,但是因为两个项目赶在一起,一直没有时间看这个。

由于这个都是在同一个数据库,所以,还是从数据库和jdbc这一方面来尝试优化。

首先我想到的,就是批处理,针对表A、B、C,分别用3个batchInsert来批量操作,如果是用的spring data,或mybatis等框架,都有相应的方式进行批量更新。

其次,你提到这几个表都是千万级别,那么,对表结构的设计、索引和外键等,都需要考虑,去掉没必要的索引(数据更新需要更新索引,如果索引过多就会影响性能),使用合理的字段类型,减少无谓的数据存储(这可以减少数据存储使用的磁盘,对数据量大的表进行查询时,要尽量减少读磁盘的次数)。

虽然在数据量大的时候,可以使用分库分表,但是这会增加系统的复杂度,如果就是三五千万的数据量,还是不需要做分库分表。

0
0

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

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

1149 学习 · 153 问题

查看课程