当前位置: 首页 > 面试题库 >

如何避免MySQL中的竞争条件

松琦
2023-03-14
问题内容

我正在开发的应用程序中存在潜在的竞争状况,我想在查询中考虑和避免这种情况。

总结应用程序html" target="_blank">流程…

  1. entries表中创建一个新行:

INSERT INTO entries ( name, email ) VALUES ( 'Foo Bar', 'foo@example.com' );

  1. 通过查看对时间敏感的prizes表格,找出Bar先生是否是获胜者:

SELECT id FROM prizes WHERE various_time_conditions = 'met' AND id NOT IN ( SELECT prize_id FROM entries );

  1. 如果他是赢家,请相应地更新他的条目行:

UPDATE entries SET prize_id = [prize id] WHERE id = [entry id];

由于每个奖项只能颁发一次,因此我需要消除比赛条件的任何可能性,在这种情况下,另一个过程可以查询奖项表并更新上述步骤2和3之间的条目表。

我一直在做一些研究,发现了大量关于事务的信息(我的所有表都使用InnoDB)以及使用MySQL的SELECT ... FOR UPDATE语法,但是我对于哪一个最适合我的解决方案感到困惑。


问题答案:

您将要锁定奖金记录。因此,如果您不打算使用winner_id之类的东西,请在奖品表上添加一些可用性标志(也许具有默认值)。像这样的东西:

SELECT id FROM prizes WHERE ... AND available = 1 FOR UPDATE

然后,如果您确实分配奖品,请设置可用性:

UPDATE prizes SET available = 0 WHERE id = ...

当然,您需要将其包装在一个事务中。

确保 每次 检查奖金是否可用时,都将其添加AND available = 1 FOR UPDATE到查询中,因为SELECT没有的a不会FOR UPDATE等待锁定。



 类似资料:
  • 我不清楚它写在哪里 私有构造函数的存在是为了避免将复制构造函数实现为此(p.x,p.y)时出现的争用条件;这是私有构造函数捕获习惯用法的一个例子(Bloch和Gafter,2005)。 我知道它提供了一个getter来在数组中同时检索x和y,而不是为每一个单独的getter,所以调用者将看到一致的值,但为什么是私有构造函数呢?这里有什么诀窍

  • 我有一个分布式任务队列,其中的任务如下所示: 这里有一个竞争条件:如果任务队列软件在完全相同的时间启动其中两个任务,它们都将从数据库中获得相同的<code>old_path</code>,并且竞争失败者的取消链接调用失败(将失败者的新路径从未来的取消链接中孤立出来)。 有没有办法让我构建它来绕过这场比赛?如果需要,我可以从当前设计中抛出几乎任何东西。具体来说,我使用的是PostgreSQL,Pyt

  • 问题内容: 如何停止MySQL中的竞争条件?当前的问题是由一个简单的算法引起的: 从表中选择一行 如果不存在,将其插入 然后会得到重复的行,或者如果您通过唯一/主键阻止它,则会出现错误。 现在,通常我认为事务在这里有所帮助,但是由于该行不存在,所以事务实际上并没有帮助(或者我是否错过了什么?)。 LOCK TABLE听起来有些矫kill过正,尤其是如果该表每秒更新多次。 我唯一想到的其他解决方案是

  • 我正在使用Java Spring框架和Hibernate。我正在做一个电子商务web应用程序,其中公共用户可以从web应用程序购买产品。每个产品都有一个数量计数。 问题 1)我想确认这个关于悲观锁定的答案有助于解决我的问题。 2)我的工作流程正常吗?有没有更好的方法?

  • 9.1. 竞争条件 在一个线性(就是说只有一个goroutine的)的程序中,程序的执行顺序只由程序的逻辑来决定。例如,我们有一段语句序列,第一个在第二个之前(废话),以此类推。在有两个或更多goroutine的程序中,每一个goroutine内的语句也是按照既定的顺序去执行的,但是一般情况下我们没法去知道分别位于两个goroutine的事件x和y的执行顺序,x是在y之前还是之后还是同时发生是没法

  • 问题内容: 在确定文件是否存在时,使用try语句如何避免“竞争条件”? 我之所以这样问是因为高度支持的答案0)(更新:已删除)似乎暗示使用会创造机会,否则这种机会就不会存在。 给出的示例是: 但与以下内容相比,我不了解如何避免出现竞争状况: 调用如何使攻击者能够处理他们无法完成的文件? 问题答案: 比赛条件,当然,你的程序和文件上运行一些其他的代码之间(竞争状态总是需要至少两个平行的进程或线程,看