Mysqli_fetch_assoc -如果数据在此期间被更改会发生什么


mysqli_fetch_assoc - what happens if the data is changed in the meanwhile?

在PHP中,我使用mysqli_fetch_assoc()在while循环中获取特定查询中的每条记录。

我想知道如果数据在运行循环(由另一个进程或服务器)时更改会发生什么,从而使记录不再与查询匹配。它还会被取走吗?

换句话说,当您执行query()时,获取的记录数组是否固定?或者不是这样?


更新:

我理解这是一个特性,结果集不改变当数据改变,但如果你真的想要呢?在我的循环中,我对已经由另一个服务器更新的记录不感兴趣。我如何检查,不做一个新的查询每条记录,我取回??

更新:

详细解释:

我正在研究某种搜索引擎刮板,在数据库中搜索值。这是由几个服务器同时完成的。被抓取的项目不应该再被搜索。我不能真正控制哪个服务器搜索哪个项目,我希望我可以检查一个项目的状态,同时获取记录集。因为它是一个大数据集,我不转移整个结果集之前搜索,我取每条记录,当我需要它…

简介

我想知道如果数据在运行循环(由另一个进程或服务器)时改变会发生什么,使记录不再与查询匹配。它还会被取走吗?

是的。

换句话说,当您执行query()时,获取的记录数组是否固定?或者不是这样?

是的。

如果一个DBMS容易受到表更新和查询结果集迭代之间的竞争条件的影响,那么它就不值得使用。

当然,就数据库本身而言,您的SELECT查询在任何数据可以更改之前已经完成;结果集缓存在数据库和PHP脚本之间的某个层中。


深入

关于ACID原则*:

在数据库的上下文中,对数据的单个逻辑操作称为事务。

用户激活的TRANSACTION s可以包含几个连续的查询,但是ISO/IEC 9075-2中的4.33.4和4.33.5描述了这是如何在每个查询级别隐式地发生的:

以下sql语句是事务初始化的sql语句,也就是说,如果没有当前的SQLtransaction执行该类的sql语句,然后执行sql事务初始化,通常在sql语句继续执行之前:

  • 所有SQL-schema语句
    • 以下SQL-transaction声明:
    • <start transaction statement> .
    • <savepoint statement> .
    • <commit statement> .
    • <rollback statement> .
  • 以下SQL-data声明:
    • [. .]
    • <select statement: single row> .
    • <direct select statement: multiple rows> .
    • <dynamic single row select statement> .
    • [. .]
  • [. .]

另外,4.35.6:

sql语句在sql事务中的作用

在sql事务中执行sql语句没有对sql数据或模式的影响[…]。与serializable一起这意味着所有的读操作都是可重复的在隔离级别SERIALIZABLE的sql事务中,除非:

1)更改sql数据或模式及其内容的影响由sql事务本身显式生成

2)提供给外部调用的SQL参数值差异的影响程序。

3)参考文献对时变系统的影响CURRENT_DATE和CURRENT_USER等变量


您的更宽要求

我知道这是一个功能,结果集不改变当数据改变,但如果你真的想要呢?在我的循环中,我对已经由另一个服务器更新的记录不感兴趣。我如何检查,不做一个新的查询每条记录,我取回??

你不能。

虽然您可以控制连接器执行的缓冲类型(在本例中是MySQLi),但您不能覆盖上面解释的SQL的低级事实:没有INSERTUPDATEDELETE将对正在进行的SELECT产生影响

一旦SELECT完成,结果是独立的;你可以控制这些独立数据的缓冲传输,但这并不能真正帮助你做你想做的事情。

这是相当幸运的,坦率地说,因为你想做的事情听起来相当奇怪!


*严格来说,MySQL对于非默认存储引擎InnoDB, BDB和Cluster之外的表只有部分 acid遵从,MyISAM不支持[user-唆使]事务。尽管如此,"我"似乎仍然适用于这里;否则MyISAM基本上是没用的。