在PHP5.4中,线程安全是一个真正的问题吗?
在我的PHP5.4.0应用程序(IIS、FastCGI、非线程安全)中,两个人是否可以通过在完全相同的时间运行相同的代码来更新数据库中的同一个表,并无意中弄乱彼此的数据 我问这个问题的原因是因为我偶尔会看到无法解释的数据故障,在最近的一个案例中,我发现另一个客户在完全相同的时间更新了同一个表在PHP5.4中,线程安全是一个真正的问题吗?,php,thread-safety,Php,Thread Safety,在我的PHP5.4.0应用程序(IIS、FastCGI、非线程安全)中,两个人是否可以通过在完全相同的时间运行相同的代码来更新数据库中的同一个表,并无意中弄乱彼此的数据 我问这个问题的原因是因为我偶尔会看到无法解释的数据故障,在最近的一个案例中,我发现另一个客户在完全相同的时间更新了同一个表 我的问题的第二部分是,如果确实发生了这种情况,我如何防止它?如果您在每个请求中执行多个SQL语句而不使用事务,那么这是很有可能的。SQL语句是原子的,就像事务包装的语句序列一样,所以不应该出现“故障” 此外
我的问题的第二部分是,如果确实发生了这种情况,我如何防止它?如果您在每个请求中执行多个SQL语句而不使用事务,那么这是很有可能的。SQL语句是原子的,就像事务包装的语句序列一样,所以不应该出现“故障” 此外,如果您在SQL以外的任何位置共享不同请求之间的状态(例如平面文件),那么至少可以说线程安全会受到损害 第二部分:使用事务:)由于非线程安全的PHP,它们不能“弄乱彼此的数据”,不,除非您正在准备/编写Apache设置(例如,使用
SetLocale
),或者您已经将其编程为同时更新共享信息(例如,Amadam所说的平面文件)
大多数正常进程,如MySQL、读取GET参数等不会受到影响
因此,除非您的问题是区域设置,否则这将是您的代码,而不是线程设置
如果使用SetLocale,那么事务或其他方法不会有任何区别。任何其他你可以编程的东西
如果您没有为并发操作编程,您可能会弄乱数据-这可能发生在线程安全和非线程安全的情况下。请记住,即使在“线程安全”中,也可以以不同的速度和顺序处理并发线程 下面是一个危险的例子:
- 语句a)读取表以获取下一个更新值
- 语句b)使用上一个值写入表
- 语句c)为下一个用户更新“下一次更新”表
如果可以的话,第三种选择是最好的。表锁可能会变得混乱,我的事务无法解决您的问题。这完全取决于您的代码如何实现读-修改-写操作。+1个非常好的问题;我以前从未想过,请注意PHP版本中的“非线程安全”与您所询问的线程安全类型无关。