1

我有两个 PHP 文件(a.php,b.php)。在 a.php 中,我从表中检索一个值并在 PHP 中显示它并将其发送到 b.php。在 b.php 中,我将该值增加 1 并在表上更新它,(但由于许多操作,b.php 将花费更多时间)。现在的问题是在b.php中执行操作时,如果我单击a.php执行另一个任务,我需要获取增量值以显示在a.php中,但它只会显示以前的值,因为b。 php 没有完全执行。帮我解决这个问题。

4

2 回答 2

7

一个INSERT, UPDATE, orDELETE操作会锁定相关的表 [myISAM] 或行 [InnoDB] 直到操作完成。如果 aSELECT试图读取锁定的对象,它将等待操作完成。

值得注意的是,除非您的服务器严重超载,或者您的//INSERT操作数在数千行中,或者两者兼而有之,否则您甚至不会注意到等待。UPDATEDELETE

简而言之:甚至不必担心您所描述的内容。

于 2013-04-11T15:35:12.953 回答
1

您正在描述竞争条件。如果脚本 A 必须等待脚本 B 的所有操作完成以确保计数列的正确含义,那么您必须通过表锁阻塞脚本 A(无论引擎是 MyIsam 还是 InnoDB,这都是正确的)。但是,如果脚本 A 不需要等待 B 的所有操作完成以赋予计数列正确的含义(即只需要等待递增操作),那么您无需做任何特别的事情。

话虽如此,脚本 A 可能不是您需要担心的。需要增加计数列的脚本 B 的其他调用更有可能创建您的竞争条件。确保您通过 SQL 代码执行增量,而不是将值拉入 PHP,然后重新保存到数据库。

最后,您需要确保不会无缘无故地创建聚合列。如果计数列仅仅是满足特定条件集的行数,只需使用查询而不是创建保存计数的列(聚合列/表仅应在分析显示有必要且应该用于缓存工作时)明确命名以表示这一点)。

于 2013-04-11T15:54:01.737 回答