这主要是一个理论问题,而且主要是关于MySQL。 我可以编写一个单独的查询,从查询开始运行到结束时插入一些记录,假设表没有时间戳等,因此无法从表中的数据推断出此信息。
我厌倦了这个(也许它会澄清上面的内容):
select -(count(*) - (sleep(300) + count(*)) from my_table;
但它似乎并没有完成这项工作。 我知道我可以编写一个存储过程来执行此操作,但我只是好奇是否可以在单个查询中执行此操作,而无需编写新的函数/存储过程。
答案 0 :(得分:1)
不,你真的不能,至少在理论上。数据库支持ACID properties个事务。 ACID中的“I”代表隔离,这特别意味着两个查询不会相互干扰。换句话说,查询不应该看到在查询开始后发生的插入。
实际上,根据设置,SELECT
不一定表现为自己的交易。但是,它只能在任何给定的瞬间看到数据库,而不是知道何时发生特定的更改。
有适当的方法来实现你想要的。一个简单的方法是完全锁定SELECT
的表(在MySQL中,您可以使用for update
指令执行此操作)。查询仍然无法计算新行的数量。但是,无论如何它都会知道答案:0。