5

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

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

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

显然,这是一个经典案例,我会使用事务或锁或互斥锁等。

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

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

编辑: 我不确定 select for update 的权限是否包含在上述内容中。负责回答我问题的人很难找到,我一直在寻找他...

4

2 回答 2

1

很奇怪,您可以进行更新,但不能锁定表(更新是某些引擎的锁定表和其他引擎的锁定行)。但是如果你真的不能这样锁定,你可以使用get_lock 函数。它就像互斥锁一样工作。

PS 如果您只使用 assignment( set a=10) 进行更新,您可能会丢失一些数据。如果您在filed( set a=10+a) 上使用带有ref 的赋值,则永远不会发生。

于 2013-02-22T13:21:07.340 回答
0

你不能一个电话就搞定,那样就不会太重要了吗?

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
于 2013-02-22T13:23:05.107 回答