场景:使用rabbitmq,生产者消费者模式
消息队列收到一个删除某条数据的信息
一个客户端收到后,进行删除业务操作(假如业务操作比较繁琐,数据在10秒之后才能删除
在处理数据的同时(也就是10秒之内),另外一个客户端又接收到了更改这条数据的信息,但是之前的数据并没有删除。这会不会造成数据冲突
另,有没有好的解决方案,谢谢
场景:使用rabbitmq,生产者消费者模式
消息队列收到一个删除某条数据的信息
一个客户端收到后,进行删除业务操作(假如业务操作比较繁琐,数据在10秒之后才能删除
在处理数据的同时(也就是10秒之内),另外一个客户端又接收到了更改这条数据的信息,但是之前的数据并没有删除。这会不会造成数据冲突
另,有没有好的解决方案,谢谢
不知道第2点的操作到底有多繁琐, 比如涉及几张表, 是否跨库, 是否有其它网络IO操作, 所以只能提供一些一般化的建议 (假设你采用的是MySQL)
采用事务(在你的表是一个库内的情况下有效), 在给这个业务进行删除时, 可以给暴露给最外面的加一个悲观锁, 这样将会阻塞其它的mysql客户端的写请求, (具体实现是在事务内用
select * from my_table where id = my_id for update
)在事务实现不方便的情况下, 可以定义一个状态常量为"待删除". 在开始操作删除时, 先变更掉你这整个业务操作的状态为待删除. 另一边, 你的修改操作则需要加上
where status != 待删除
上面第2点也可以用redis等缓存来实现, 删除前加个key(或者原子计数+1), 操作完成之后, 删除redis的那个key(或者原子计数-1)
不是MySQL也关系不大, 思路基本一致