我很好奇PHP脚本和MySQL的行为方式? 该脚本基本上是两个SQL查询。
第一个SELECT并从某个id决定的特定行的列中获取一个数字。
然后,如果数字是正数,则第二个通过减去一定数量来更新该列。
显然这是一个经典案例,我会使用交易或锁定或互斥或什么。
我的问题是: 在网站中,两个或更多用户完全可以同时为同一行调用脚本。如果您不使用事务或锁定表,PHP将如何处理?它们是两个查询/函数调用,但它们在一个脚本中。它是否等待整个脚本返回给它的相应用户再次为另一个用户运行它,或者因为伪随机性它们是不同的查询它可能在多个用户调用相同脚本然后第二个查询不同的集合上运行第一个查询。
基本上我问,因为我正在做一些我没有足够权限使用事务或锁的东西,我想知道我是否可以避免使用互斥锁(我不确定这个词,基本上是一个新表对于调用者;在调用上面的脚本之前,我将在之前调用一个新脚本,我将把表的布尔列设置为true,以便写入,这样其他人在原始脚本完成时就会崩溃,之后bacl变为false所以下一行可以做等等)
修改 我不确定选择更新是否包含在上面提到的权限。那个负责回答我问题的人很难找到,而且我和我一起搜索他......
答案 0 :(得分:1)
很奇怪你可以做更新,但不能锁定表(更新是某些引擎的锁定表和其他锁定行)。但如果你真的无法锁定这种方式,你可以使用get_lock function。它的工作方式就像互斥锁。
P.S。如果您只使用带有赋值(set a=10
)的更新,则可能会丢失一些数据。如果您在归档(set a=10+a
)上使用带有ref的赋值,那么它永远不会发生。
答案 1 :(得分: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