当一个PHP脚本多次同时访问MySQL数据库时会发生什么情况?

当一个PHP脚本多次同时访问MySQL数据库时会发生什么情况?,php,mysql,mutex,race-condition,Php,Mysql,Mutex,Race Condition,我对PHP脚本和MySQL的行为很好奇? 脚本基本上是两个SQL查询 第一个从由某个id决定的特定行的列中选择并获取一个数字 然后,如果数字为正数,则第二个将通过减去某个量来更新列 很明显,这是一个典型的例子,我会使用事务、锁、互斥体等等 我的问题是: 在网站中,两个或多个用户完全有可能同时调用同一行的脚本。如果不使用事务或锁表,PHP将如何处理?它们是两个查询/函数调用,但在一个脚本中。它是否等待整个脚本返回到其对应的用户以再次为另一个用户运行它,或者因为它们是不同的查询(因为伪并行),它可能

我对PHP脚本和MySQL的行为很好奇? 脚本基本上是两个SQL查询

第一个从由某个id决定的特定行的列中选择并获取一个数字

然后,如果数字为正数,则第二个将通过减去某个量来更新列

很明显,这是一个典型的例子,我会使用事务、锁、互斥体等等

我的问题是: 在网站中,两个或多个用户完全有可能同时调用同一行的脚本。如果不使用事务或锁表,PHP将如何处理?它们是两个查询/函数调用,但在一个脚本中。它是否等待整个脚本返回到其对应的用户以再次为另一个用户运行它,或者因为它们是不同的查询(因为伪并行),它可能会对调用同一脚本的多个用户运行第一个查询,然后对不同的集运行第二个查询

基本上,我这样问是因为我正在做一些我没有足够权限使用事务或锁的事情,我想知道我是否可以避免互斥(我不确定这个词,基本上是一个新的表供调用者使用;在调用上面的脚本之前,我将调用一个新的脚本,在这个脚本之前,我将把表中的布尔列设置为true以供编写,这样其他人在原始脚本完成时不能使用,然后将bacl设置为false,以便下一个队列可以执行,依此类推)

编辑:
我不确定“选择更新”的权限是否包含在上述内容中。负责回答我问题的人很难找到,我在搜索他时遇到了麻烦…

很奇怪,你可以进行更新,但无法锁定表(更新是为某些引擎锁定表,为其他引擎锁定行)。但若你们真的不能锁定,那个么你们可以使用这种方式。它的工作方式类似于互斥锁


注意:如果你只使用赋值更新(
set a=10
),你可能会丢失一些数据。如果你在字段上使用ref赋值(
set a=10+a
),它永远不会发生。

你不能一次调用就完成它,这样就不会太重要了吗

UPDATE T1
    SET T1.COLUMN = T2.COLUMN - 4
    FROM TABLE1 AS T1
    INNER JOIN TABLE2 AS T2
        ON T1.COLUMN = T2.COLUMN
    WHERE T2.COLUMN = ID
    AND T2.COLUMN > 0

实际上,我过于简化了过程,因为对于核心问题,您不需要知道脚本的细节。我已经想到了这一点,这将是一个非常大且复杂的查询。不过,感谢您的思考:)是的,刚刚得到一个响应,我可以锁定表…所以你是对的。至于P.S,这实际上就是我正在做的;使用列上的引用(free=free-{$diff}),所以现在我知道我可以使用SELECT…进行更新。你知道这是如何工作的吗。按照我的理解,它会为两个读取锁定结果行(来自SELECT查询)(选择)和写入(更新),但我不确定它何时释放它们…在这些行上的下一次更新之后?选择…仅用于事务中的更新工作。它将锁定行直到事务结束。因此,似乎这种方法非常适合,肯定比锁定表更好。谢谢我们