在PHP5.4中,线程安全是一个真正的问题吗?

在PHP5.4中,线程安全是一个真正的问题吗?,php,thread-safety,Php,Thread Safety,在我的PHP5.4.0应用程序(IIS、FastCGI、非线程安全)中,两个人是否可以通过在完全相同的时间运行相同的代码来更新数据库中的同一个表,并无意中弄乱彼此的数据 我问这个问题的原因是因为我偶尔会看到无法解释的数据故障,在最近的一个案例中,我发现另一个客户在完全相同的时间更新了同一个表 我的问题的第二部分是,如果确实发生了这种情况,我如何防止它?如果您在每个请求中执行多个SQL语句而不使用事务,那么这是很有可能的。SQL语句是原子的,就像事务包装的语句序列一样,所以不应该出现“故障” 此外

在我的PHP5.4.0应用程序(IIS、FastCGI、非线程安全)中,两个人是否可以通过在完全相同的时间运行相同的代码来更新数据库中的同一个表,并无意中弄乱彼此的数据

我问这个问题的原因是因为我偶尔会看到无法解释的数据故障,在最近的一个案例中,我发现另一个客户在完全相同的时间更新了同一个表


我的问题的第二部分是,如果确实发生了这种情况,我如何防止它?

如果您在每个请求中执行多个SQL语句而不使用事务,那么这是很有可能的。SQL语句是原子的,就像事务包装的语句序列一样,所以不应该出现“故障”

此外,如果您在SQL以外的任何位置共享不同请求之间的状态(例如平面文件),那么至少可以说线程安全会受到损害

第二部分:使用事务:)

由于非线程安全的PHP,它们不能“弄乱彼此的数据”,不,除非您正在准备/编写Apache设置(例如,使用
SetLocale
),或者您已经将其编程为同时更新共享信息(例如,Amadam所说的平面文件)

大多数正常进程,如MySQL、读取GET参数等不会受到影响

因此,除非您的问题是区域设置,否则这将是您的代码,而不是线程设置

如果使用SetLocale,那么事务或其他方法不会有任何区别。任何其他你可以编程的东西


如果您没有为并发操作编程,您可能会弄乱数据-这可能发生在线程安全和非线程安全的情况下。请记住,即使在“线程安全”中,也可以以不同的速度和顺序处理并发线程

下面是一个危险的例子:

  • 语句a)读取表以获取下一个更新值
  • 语句b)使用上一个值写入表
  • 语句c)为下一个用户更新“下一次更新”表
这些语句可以由运行all的“User 1”处理,然后是“User 2”(理想情况,以及如何编程)。但同样,“用户1”运行“a”和“b”,然后“用户2”运行“all”,然后“用户1”运行“c”——在本例中,“用户2”将覆盖“用户1”所写的内容

(重复,这与PHP中的“非线程安全”无关。)

如何避开后一个问题:

  • 我可以帮助你;除非您使用“with CONSISTENT SNAPSHOT”选项,否则它们实际上对上面的示例没有帮助,因为它们所做的只是延迟提交,而且您在语句“a”中读取值的时间太早
  • 允许您阻止用户读取或写入表,因此在上面的示例中,首先锁定“更新”表,运行事务,然后释放锁。这迫使第二个用户等到“用户1”完成批次后再读取编号
  • 使用mySQL的功能,包括“自动递增”主键,或“插入到…重复键上”或“替换”等代码

  • 如果可以的话,第三种选择是最好的。表锁可能会变得混乱,我的事务无法解决您的问题。

    这完全取决于您的代码如何实现读-修改-写操作。+1个非常好的问题;我以前从未想过,请注意PHP版本中的“非线程安全”与您所询问的线程安全类型无关。