2013-02-22 100 views
5

我很好奇PHP脚本和MySQL的行为? 该脚本基本上是两个SQL查询。PHP脚本在多次同时访问MySQL数据库时会发生什么?

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

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

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

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

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

编辑: 我不确定选择更新是否包含在上面提到的权限。负责回答我的问题的人很难找到,我已经与我一起寻找他...

回答

1

很奇怪,你可以做更新,但不能锁定表(更新锁定表的一些引擎和锁定其他行)。但是,如果你真的无法锁定,你可以使用get_lock function。它像互斥体一样工作。

P.S.如果您仅使用更新(set a=10),则可能会丢失一些数据。如果您在该字段使用转让(set a=10+a),这绝不会发生。

+0

是的,刚刚得到了一个响应,我可以锁表...所以你是对的。至于P.S,实际上是我在做什么;在列上使用引用(free = free - {$ diff}) – 2013-02-22 13:30:00

+0

所以现在我知道我可以使用SELECT ... FOR UPDATE。你知道这是如何工作的。我理解它的方式是锁定select(select)和write(update)两个结果行(来自select查询),但我不确定它何时释放它们......在这些行上进行下一次更新后? – 2013-02-22 13:32:23

+1

SELECT ... FOR UPDATE只在交易中工作。它将锁定行直到事务结束。 – sectus 2013-02-22 14:01:54

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 
+0

好吧,我真的过于简单化了这个过程,因为对于核心问题你不需要知道脚本的细节。我只想说我已经想到了,这将是一个非常庞大而复杂的查询。尽管如此,感谢虽然:) – 2013-02-22 13:28:39

相关问题