例如:一张表中有100条数据,有三台服务同时批处理这100条并修改其中某一字段,三台服务处理逻辑相同,如何防止并发,使得每台服务查询的都是未操作过的数据。
乐观锁就行查询或修改的时候带上乐观锁即可。被修改了乐观锁版本号就会变,这个时候查询的版本不一致就找不到这条数据就不会被重复处理
你可以看看mybatis plus 乐观锁的描述与使用
如您所说,三台服务的批处理逻辑一样,那么它们的业务逻辑是不是一样?如果业务逻辑都一样,三台服务意味着其中一台去操作数据库即可,但为了使得三台服务都尽可能的发挥作用,我们可以在三台服务启动之前,为三台服务分配操作数据库记录的ID,100条记录意味着有100个id,那么我们将100个 id 均匀分配给三个服务即可,其中一个要多分配一个,这样可以避免并发两个服务同时且重复修改1条记录。
反之如果三台服务的业务不一样,它们必须都去执行这100条记录的操作,那么存在数据被覆盖是必然会发生的。只是是不是符合我们对其顺序的要求,若果你希望服务1比服务2先执行完成,那就需要在调用服务者业务逻辑中去处理了
如果数据量比较少,像只有这100条,即使只有一台来处理,另外两台不处理也可以,这样只需要在开始处理前加个分布式锁,获得锁的那台去处理就好;
如果非要每台机器都要去分别处理,可以每台机器都把这100条数据查询处理,遍历处理,遍历一条前加个分布式锁看这条数据是否被其他机器处理了;