A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【郑州校区】学成在线-第19天-讲义-分布式事务 八

4.7 乐观锁取任务
考虑订单服务将来会集群部署,为了避免任务在1分钟内重复执行,这里使用乐观锁,实现思路如下:
1) 每次取任务时判断当前版本及任务id是否匹配,如果匹配则执行任务,如果不匹配则取消执行。
2) 如果当前版本和任务Id可以匹配到任务则更新当前版本加1.
1、在Dao中增加校验当前版本及任务id的匹配方法
[AppleScript] 纯文本查看 复制代码
 public interface XcTaskRepository extends JpaRepository<XcTask, String> {
//使用乐观锁方式校验任务id和版本号是否匹配,匹配则版本号加1
@Modifying
@Query("update XcTask t set t.version = :version+1 where t.id = :id and t.version =
:version")
public int updateTaskVersion(@Param(value = "id") String id,@Param(value = "version") int
version);
... 

2、在service中增加方法,使用乐观锁方法校验任务
[AppleScript] 纯文本查看 复制代码
 @Transactional
public int getTask(String taskId,int version){
int i = xcTaskRepository.updateTaskVersion(taskId, version);
return i;
}


3、执行任务类中修改
[AppleScript] 纯文本查看 复制代码
 ...
//任务id
String taskId = xcTask.getId();
//版本号
Integer version = xcTask.getVersion();
//调用乐观锁方法校验任务是否可以执行
if(taskService.getTask(taskId, version)>0){
//发送选课消息
taskService.publish(xcTask, xcTask.getMqExchange(),xcTask.getMqRoutingkey());
LOGGER.info("send choose course task id:{}",taskId);
}
... 



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马