前言
最近公司准备接入ShardingJdbc做读写分离了,老大让我们理一理有没有写完数据立马读的场景,因为主从同步是有延迟的,如果写完读取数据走到从库,而从库正好有延迟,没读取到数据,岂不是造成了生产事故。
今天我们来看看,ShardingJdbc作为一个成熟的框架是怎么处理写完数据立即读取的场景的。
数据库介绍
我本地使用了两个库来做实验,写库(ds_0_master)和读库(ds_0_salve),两个库并没有配置主从,但也不影响实验操作。
库里有一个city 表。主库的 city 表没有数据,而从库的 city 表就一条数据。数据内容如下:
我们讨论 4 种业务场景:
- 常规写完读
- 在一个 service 里面调用另一个 service2 进行读
- 在一个 service 里面新开一个线程去调用 service2
- 在一个 service 里面调用 service2,但 service2 是新开的事务
先直接上实验结果:
1. 常规写完读
@Service
public class CityService {
@Autowired
private CityRepository cityRepository;
@Autowired
private CityService2 cityService2;
@Transactional(rollbackFor = Exception.class)
public void test(){
City city=new City();
city.setName("眉山");
city.setProvince("四川");
cityRepository.save(city);
List<City> all = cityRepository.findAll();
all.forEach(x->{
System.out.println("cityService:"+((x.getProvince().equals("四川"))?"主库":"从库&#