在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的低级事实:没有INSERT
或UPDATE
或DELETE
将对正在进行的SELECT
产生影响。
一旦SELECT
完成,结果是独立的;你可以控制这些独立数据的缓冲传输,但这并不能真正帮助你做你想做的事情。
这是相当幸运的,坦率地说,因为你想做的事情听起来相当奇怪!
*严格来说,MySQL对于非默认存储引擎InnoDB, BDB和Cluster之外的表只有部分 acid遵从,MyISAM不支持[user-唆使]事务。尽管如此,"我"似乎仍然适用于这里;否则MyISAM基本上是没用的。