统计一个学生的分数,每一行都是一个学生的异步任务的记录,有一个状态字段。服务是分布式部署,多应用实例,此时小明发起任务,希望一个请求只能落在一个实例上,创建一个异步任务。想限制同一时间只能有一个小明的任务,如何防止异步任务的重复发起(同时如果有一个状态时执行中的记录就不能再提交)
作者:俺的offer在哪
链接:
https://www.nowcoder.com/discuss/656950016589721600?sourceSSR=search
来源:牛客网
正确答案:可以使用分布式锁来防止异步任务的重复发起。在任务提交前先获取分布式锁,然后根据小明的唯一标识去查询是否有执行中的任务,如果没有则可以提交任务。
解答思路:首先,通过分布式锁确保同一时间只有一个小明的任务可以被提交。其次,通过查询小明的唯一标识和状态来判断是否有执行中的任务,如果没有则可以提交新任务。
问题考点的深度知识讲解:分布式锁是一种用来在分布式系统中同步访问共享资源的机制。通过分布式锁可以确保在多个实例中只有一个实例可以执行关键代码块,从而避免重复提交任务的问题。在查询小明的任务状态时,需要对数据库进行查询操作,需要考虑数据库的事务隔离级别、索引的使用等问题。同时,对于异步任务的处理,还需要考虑任务队列的设计、消息确认机制等方面的知识。
不基于 Redis,只用 MySQL 怎么实现?
通过数据库行锁代替Redis实现分布式锁
https://blog.csdn.net/qq_44625080/article/details/123991276
UPDATE users SET status = 3 WHERE id = 1 AND status!=3