线程安全是PHP 5.4中的一个真正问题吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了线程安全是PHP 5.4中的一个真正问题吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1709字,纯文字阅读大概需要3分钟。
内容图文
在我的PHP 5.4.0应用程序(IIS,FastCGI,非线程安全)中是否有可能让两个人通过在完全相同的时间运行相同的代码来更新数据库中的同一个表并且无意中弄乱了彼此的数据?
我问的原因是因为我看到偶尔会出现无法解释的数据故障,在最近的案例中,我发现另一位客户在同一时间更新了同一个表.
我的问题的第二部分是,如果确实发生了这种情况,我该如何预防呢?
解决方法:
由于非线程安全的PHP,它们不能“弄乱对方数据”,不,除非您正在准备/编写Apache设置(例如使用SetLocale),或者您已将其编程为同时更新共享信息(例如平面文件) ,如阿马达姆所说).
大多数正常的进程,如MySQL,读取GET参数等都不会受到影响.
因此,除非您的问题出在locales上,否则它将是您的代码,而不是线程设置.
如果是使用SetLocale,则事务或其他方法不会有任何区别.任何其他你可以编程的.
如果没有为并发操作编程,则可能会弄乱数据 – 这可能发生在线程安全和非线程安全中.请记住,即使在“线程安全”中,您也可以使用不同的速度和顺序处理并发线程.
这是一个危险的例子:
>声明a)读取表格以获取下一个更新值
>陈述b)使用先前值写入表格
>声明c)更新下一个用户的“下次更新”表.
语句可由“用户1”运行全部处理,然后是“用户2”(理想,以及如何编程).但同样如此,“用户1”运行“a”和“b”,然后“用户2”运行全部,然后“用户1”运行“c” – 在这种情况下,“用户2”将覆盖“用户1” “写道.
(重复一遍,这与PHP中的“非线程安全”无关.)
如何解决后一个问题:
> Transactions MAY可以帮到你;他们实际上不会帮助上面的例子,除非你使用“WITH CONSISTENT SNAPSHOT”选项,因为他们所做的就是延迟提交,你在语句“a”中过早地读取了这个值.
> Table locks允许您阻止用户读取或写入表,因此在上面的示例中,首先锁定“更新”表,运行转换然后释放锁.这迫使第二个用户等到“用户1”完成该批次之后才读取该号码.
>使用mySQL的功能,包括“AUTO INCREMENT”主键,或诸如“INSERT INTO … ON DUPLICATE KEY”或“REPLACE”之类的代码.
如果可以,第三种选择是最好的.表锁可能会变得混乱和交易我不能解决您的问题.
内容总结
以上是互联网集市为您收集整理的线程安全是PHP 5.4中的一个真正问题吗?全部内容,希望文章能够帮你解决线程安全是PHP 5.4中的一个真正问题吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。