更具体地说,如果我使用模拟生成器的 python db api 迭代数据库,一次给我一行,生成器是否还会返回我同时创建的新行?
我的猜测是肯定的,因为我认为这样的生成器的实现将涉及一个游标,只要请求新行,它就会简单地转到下一行。
不。
一旦您进行了 sql 查询并开始检索结果,您就不能确定新行是否会在结果集中。
结果可能在内存中,也可能在数据库的缓冲区中。
你可以做类似的事情;
while ( result = "SELECT .... where processed=0 LIMIT 1" )
{
do processing
Run Sql "UPDATE row set processed=1 where id = result[id]"
}
生成器是否还会返回我在此期间创建的新行?
如果您的意思是:“我在迭代时由其他连接创建的行”,答案是“否”。
简单地说,当执行 SELECT 查询时,您会看到数据库的“快照”。从该快照中看不到对数据库的并发更改。
事实上,如果您使用事务表(即:InnoDB),并且根据您的事务隔离级别,其他连接所做的更改可能在您打开新事务之前不可见(请记住,在auto_commit模式下,新事务是应每个请求为您打开)。