当前位置: 首页 > 知识库问答 >
问题:

MySQL查询给我不正确或旧的数据

岳研
2023-03-14

我有一个表,其中的值如下所示,

现在,我有两个线程正在尝试做同样的事情。它们如下。

  1. 从表中提取未进行或未完成的记录。
  2. 将其标记为未进展。
  3. 处理记录。
  4. 将其标记为完成。

我实现了以下内容,以确保两个线程不会同时拾取相同的记录。

  1. “从状态不在('Complete'、'InProgress')限制1的表中选择*from以更新”,从表中获取合适的记录。
  2. 在一个事务中执行了步骤1和步骤2,这样表就变成读锁定,直到拾取的记录被标记为未进行。

但是,我面临以下问题
如果线程-1正在获取一个记录,而它还没有将该记录标记为“Inprogress”,则另一个线程(线程-2)尝试进行同样的操作。线程-2有时首先获取线程-1已经选取的记录,并在线程-1事务解除锁后返回状态为“Inprogress”的相同记录。

除了在获取记录后添加状态值检查之外,我不知道如何解决这个问题,但我认为可能有一个更好的方法。

如果有更好的方法请告诉我。

下面是负责提取要处理的记录的方法的示例代码,

//存储库

class TableRepository implements JpaRepository<Table, Long> {
 @Query(value = "select * from table where status not in ('COMPLETE', 'INPROGRESS') limit 1 for update", nativeQuery=true)
 Table getOneValidRecord(); 
}

//服务类别

class TableService {

@Autowired
private TableRepository repository;

@Transactional(propagation = Propagation.REQUIRES_NEW)
public Table getOneValidRecord() {

Table table = repository.getOneValidRecord();
table.setStatus("INPROGRESS");
return repository.save(table);
}

}

共有1个答案

全心思
2023-03-14

必须使用中间保留状态。在SQL级别:

步骤1.尽量保留。

UPDATE table
SET status = 'Thread 1 reserved'
WHERE status = 'PENDING'
ORDER BY id
LIMIT 1

第二步。检查预订是否成功。

SELECT COUNT(*)
FROM table
WHERE status = 'Thread 1 reserved'

如果输出为零,则线程2过度保留了同一行。转到步骤1。如果输出超过1,则发生紧急情况。呼叫接线员。

步骤3.处理行。

UPDATE table
SET status = 'INPROGRESS'
WHERE status = 'Thread 1 reserved'
ORDER BY id
LIMIT 1
 类似资料:
  • 问题内容: 我没有为此使用模拟位置…实际上,上周代码运行良好。 我有一个可收集GPS数据并使用该应用程序本身生成的X,Y坐标显示Google地图链接的应用程序。我不是100%知道为什么它无法正常运行,但是当我请求该应用根据手机提供的GPS位置建立一个Google地图链接时,它告诉我距离我的位置有5-6个街区起源(当时我实际所在的位置)不完全是我想要的 已知: 我已设置适当的权限 上周所有代码正常工

  • 我有一个复合密钥的实体。订阅和源具有多对多的关系。 我正在使用Spring数据存储库来处理它。 当我尝试使用方法saveAll时,它会抛出 “com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:未知列'subscripti0_.subscription_id'” 同时尝试在保存后返回值。 Hibernate生成以下查询: 所以,现在我

  • 有人可以解释一下这个查询有什么问题吗?我需要将此生成的查询从弹性搜索 2 转换为弹性搜索 6。在ES2中,这个工作得很好,但在ES6中,它给我一个错误:[或]查询格式不正确,查询名称后没有start_object。我迷失在其中。OR是必要的,因为可能有更多的条件比这个。 谢谢。

  • 新网页设计在这里。我有一个登录表单,验证和工作完全在PHP,但当我尝试和验证使用ajax它不工作。当我运行页面时,它说无论输入到表单中,它都是成功的。我已经尝试了好几天,试图用许多不同的方法来验证它。如果有更好的方法请让我知道! php和登录表单位于同一页面 请帮忙!

  • 我有一个accdb文件。我正在使用ucanaccess api从我的Java项目连接到它并处理数据。(我没有MS Access,我在Java项目中使用ucanaccess作为引用库)。 但是,当我在SQL server中导入accdb文件并运行查询时,我遇到了一个奇怪的问题: 但是当我在ucanaccess中运行查询时,我会得到以下输出: 还有其他类似的不忠行为。与在SQL server中一样,对

  • 问题内容: 快速版本 基本上,我正在更新hibernate表,后续查询正在加载陈旧的值。 详细版本 hibernate(3.3.1.GA)和EhCache(2.4.2)。 包含页面的持久对象,我将页面添加到本书的中间。我正在使用Databinder / Wicket,尽管我认为这并不相关。 适用的字段/方法是: 最终结果是,有一个新页面添加到列表中,并且数据库也进行了相应更新,我已经在我的数据存储