PHP是一次一个接一个地执行吗?

时间:2012-08-08 05:03:37

标签: php transactions rollback

如果很多用户同时调用相同的PHP脚本。执行的顺序是什么? 它会排队吗?在完成1个会话的执行后,它将执行另一个?

我是服务器端编程的新手。我正在编写的PHP将访问数据库,并使用事务查询数据库(意味着如果事务中的任何查询失败,则存在提交和回滚)。如果PHP没有订单执行,那么它显然会搞砸了。

[添加]感谢您的回复,我将更具体地说明问题: 它是一个通过PHP与服务器通信的在线游戏。需要交易以确保一切都是一致的。就像注册一个新的播放器一样,我们不希望插入talbe“PlayerData”并且因为某些错误而导致“PlayerInventory”失败。他们应该成功或失败。

因此,如果PHP同时执行,那么“Rollback”或“Commit”可能会同时回滚或提交由其他PHP运行的trasaction。

那么,解决方案是什么?

提前致谢

3 个答案:

答案 0 :(得分:2)

关于您的更新...

每个php请求都有自己的数据库连接,所以如果你在一个连接上回滚它不会影响其他的php请求。它很容易:),只要你使用交易,数据库应该让你免于担心不一致。

通常php请求使用简短的生存过程,所以如果你有10个并发用户,每个人都有自己的进程,请求完成的那一刻就会被杀死

答案 1 :(得分:1)

服务器将处理每个请求。在面对并发修改时,PHP无法帮助您维护数据完整性。话虽如此,使用数据库事务将帮助您维护数据完整性,因为它会使多个查询看起来以某种串行(一个接一个)的方式执行。

如果你的数据库代码在一个事务中,你的DBMS将处理事务的东西让你看起来像一个接一个地执行数据库代码(即使实际上并不是在下面发生的事情)。这假设您的DBMS支持ACID transactions

答案 2 :(得分:1)

取决于您的网络服务器。标准的Apache安装将有多个子项以并行方式处理请求。如果您有20个孩子,并且20个人请求相同的脚本,那么您将同时运行20个脚本副本。

除非您添加通信通道(例如会话,数据库,共享文件/内存等等),否则脚本的每个副本名义上都是相互独立的,每个运行的脚本副本之间没有通信。

如果您不能在数据库上并行存在多个请求,那么您必须在数据库中实现相应的事务和表/行锁,以防止这些并行请求在彼此的脚趾上踩踏。它们仍将并行执行,但事务/锁定将确保实际的数据库操作是串行的。