首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用“`transactions`”而不使用“`select .为了最新消息?

使用“`transactions`”而不使用“`select .为了最新消息?
EN

Database Administration用户
提问于 2018-11-28 04:43:06
回答 1查看 404关注 0票数 0

我有一张不应该相交的范围表:

id :从财政到

我有一个算法,它执行以下操作:

  1. 找出差距(例如,差距为6-11,15-19,25-26,31-空)
  2. 从表中计算不相交的随机范围
  3. 插入这些范围(例如insert into table (from,to) values (15,17)insert into table (from,to) values (31,40))

现在,如果该算法完全同时发生,则有可能插入范围15-1715-19,以及我的表的范围相交。

我知道,在这种情况下,通常使用transactionsselect ... for update。但是,我并没有真正选择要更新的任何行。相反,我首先计算数据库中不存在的空白。空白的计算是用这个SQL完成的:

代码语言:javascript
复制
SELECT gap_starts, gap_ends  FROM
   (SELECT (t1.to + 1) as gap_starts,
    (SELECT Min(t3.from) - 1 FROM table t3 WHERE t3.from > t1.to) as gap_ends
    FROM table t1
    WHERE NOT EXISTS (SELECT t2.from FROM table t2 WHERE t2.from = t1.to +1 )
   )

如何在这里使用transaction确保步骤3中插入的行不相交?

EN

回答 1

Database Administration用户

发布于 2018-11-28 04:59:13

您需要一个事务,它需要抓住与FOR UPDATE的差距。问题是您没有索引来帮助完成任务。

我建议连续设置一个startend,这会使任务变得很困难。相反,如果只有一个start (或者,相当于end),那么您可以有一个索引并成功地使用SELECT...FOR UPDATE

由于表中有空白,因此需要一种表示“实际范围”和“未使用范围”的方法。这将涉及另一列(您可能已经拥有)。

构建这样一个结构,再加上一些代码来弥补一部分空白,这是这里,我在这里讨论(作为一个例子)将IP地址的范围与它们的“所有者”关联起来。我使用一个特殊的owner_id来表示一个范围是“未分配的”。

代码的设计考虑到了速度,因为在start..end上的搜索在规模上执行得很糟糕。

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

https://dba.stackexchange.com/questions/223608

复制
相关文章

相似问题

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