首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种基于SQL查询锁定块执行的方法?

是否有一种基于SQL查询锁定块执行的方法?
EN

Stack Overflow用户
提问于 2021-07-05 16:17:35
回答 1查看 60关注 0票数 0

背景:我有一个迷你聊天应用程序,可以让你为许多对话者创建聊天室。一组对话者的聊天室只能创建一次,因此,如果使用同一组对话者创建聊天室的请求执行两次,则只需创建一个聊天室:

因此:

  • HTTP /聊天室用于interlocutor1和interlocutor2 ->创建聊天室
  • HTTP POST /聊天室为interlocutor1和interlocutor2 ->跳过创建空间,因为已经存在

基本上,这是一个简单的多对多的关系,有三个表: chat_rooms、chat_room_interlocutor和对话者。

当使用单个线程环境时,似乎一切都很好,然而,在多线程上,我为同一组对话者提供了重复的聊天室。这似乎是一个典型的并发问题,可以通过锁定机制来解决,但是,当两个或多个微服务实例可用时,则应该将锁定委托给数据库级别。

因为我使用Spring,所以我尝试在JPA查询上使用@Lock(LockModeType.PESSIMISTIC_READ),但是第二个线程不会挂在查询上并创建重复的聊天室。该查询如下所示:

代码语言:javascript
复制
select c.chat_id from chat c
join chat_interlocutor c1 on  c1.chat_id = c.chat_id and c1.interlocutor_id = ?1
join chat_interlocutor c2 on c2.chat_id = c.chat_id and c2.interlocutor_id = ?2

整个场景如下:

Microservice1

interlocutor2)

  • It
  1. 检查两个对话者之间是否存在聊天( interlocutor1和interlocutor1不存在,所以创建interlocutor1

)

Microservice2

  1. 检查两个对话者之间是否存在聊天( interlocutor1和interlocutor2),这里microservice1还没有提交
  2. ,所以在这里创建它,我们正在创建重复的聊天室
EN

回答 1

Stack Overflow用户

发布于 2021-07-06 07:40:06

您最简单的解决方案是使用数据库中唯一的聊天室id作为同步机制(因为这是在微服务之间共享的)。

为此,您必须在会话启动时创建聊天室实体。您必须确保始终使用从2名参与者中确定的唯一ID创建它。如果创建工作,那么这是一个新的聊天室,如果有一个独特的密钥违反,那么聊天室已经存在。

您所描述的流程几乎是正确的,但是您错过了创建数据库中的聊天室的过程,该聊天室具有由microservice构建的唯一id。您仍然需要检查聊天室是否已经存在,因为这样可以避免太多的冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68259252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档