事务是否停止MySQL中的所有竞争条件问题?

事务是否停止MySQL中的所有竞争条件问题?,mysql,transactions,race-condition,Mysql,Transactions,Race Condition,考虑这种情况: 开始交易 使用自动递增键在表中插入20条记录 获取第一个插入id(假设它是153) 更新该表中id>=153的所有记录 承诺 第4步安全吗? 也就是说,如果另一个请求几乎同时出现,并且在上述步骤2之后但在步骤4之前插入另外20条记录,是否会有竞争条件 也就是说,如果另一个请求几乎同时出现,并且在上述步骤2之后但在步骤4之前插入另外20条记录,是否会有竞争条件 是的,会的 记录21到40将被事务2锁定 事务1将被阻止,并等待事务2提交或回滚 如果事务2提交,则事务1将更新40记录(

考虑这种情况:

  • 开始交易
  • 使用自动递增键在表中插入20条记录
  • 获取第一个插入id(假设它是
    153
  • 更新该表中
    id>=153的所有记录
  • 承诺
  • 第4步安全吗?

    也就是说,如果另一个请求几乎同时出现,并且在上述步骤2之后但在步骤4之前插入另外20条记录,是否会有竞争条件

    也就是说,如果另一个请求几乎同时出现,并且在上述步骤2之后但在步骤4之前插入另外20条记录,是否会有竞争条件

    是的,会的

    记录
    21
    40
    将被事务
    2
    锁定

    事务
    1
    将被阻止,并等待事务
    2
    提交或回滚


    如果事务
    2
    提交,则事务
    1
    将更新
    40
    记录(包括由事务
    2
    插入的记录)

    我认为这不能被归类为竞争条件,而是DMBS特定的行为。基本上,如果DBMS锁定新插入的记录,那么在提交第二个事务之前,第一个事务将看不到第二个事务中的记录


    当然还有锁定表的问题,如果第一个事务写入锁定了表,那么第二个事务将在写入时被阻止,直到第一个事务完成。但不确定标准mysql是否提供这种功能。我知道它是MSSQL服务器。

    你能澄清一下吗?你是说有问题还是没有问题?为什么你会有一个单独的更新步骤,而不是一开始就插入正确的数据?这太奇怪了。如果您首先插入了正确的数据,就不需要担心“竞争条件”。更新
    其中id>153
    也是一个非常奇怪的查询。自动递增id对它们没有逻辑关系,因此您永远不应该(据我所知)仅根据id进行更新。最后,我不知道有任何“first insert id”函数。@ButtleButkus“如果您使用单个insert语句插入多行,LAST_insert_id()将返回为第一个插入行生成的值”关于最后一个_INSERT_ID(),您是对的,但这并没有改变这样一个事实,即问题似乎是关于一种假设情况,如果遵循基本的数据库结构和过程,这种情况将永远不会存在。为什么你的更新标准永远是一个没有意义的id的值?我想不出任何理由。我不会称之为“比赛条件”,因为这是荒谬的。为什么插入后会立即更新,而您可以插入正确的值作为开始?这就是这个问题没有意义的真正原因。我真的记不起最初的问题(大约3年前),但我认为这是必要的不管理由如何,我相信这个问题的基本原则是合法的——在该事务中,在插入过程中插入的记录是否会被“看到”并受到更新的影响?