You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SELECT执行期间插入的符合条件记录会被查询到吗?多库分析

不同数据库下的查询行为分析

这个问题的核心取决于数据库的事务隔离级别和查询采用的读取模式(快照读/当前读),不同数据库的默认行为差异不小,我逐个给你说明:

PostgreSQL

PostgreSQL默认的事务隔离级别是READ COMMITTED,普通的SELECT查询会在语句启动瞬间创建一个数据库快照,整个查询过程都会基于这个快照返回数据——也就是说,查询开始后插入的满足条件的新记录,不在这个快照的范围内,所以不会被本次SELECT返回。

哪怕你把隔离级别改成REPEATABLE READ或者SERIALIZABLE,也是基于事务启动时的快照(REPEATABLE READ是事务级快照,SERIALIZABLE是更严格的事务级快照),同样看不到查询执行过程中新增的记录。

只有当你使用SELECT ... FOR UPDATE/SELECT ... FOR SHARE这类当前读语句时,才会读取最新的数据库状态,但这类语句主要用于加锁,普通查询不会这么用。另外PostgreSQL不支持READ UNCOMMITTED(脏读)级别,所以不存在能读到未提交插入的情况。

MySQL

MySQL的情况分引擎和隔离级别:

  • InnoDB引擎(默认):
    • 默认隔离级别是REPEATABLE READ,普通SELECT是快照读,基于事务启动时的快照。如果是自动提交模式下的单条SELECT(相当于一个独立事务),查询启动后的插入记录不在快照里,不会被返回;如果是在一个显式事务中,整个事务内的SELECT都用事务启动时的快照,同样看不到后续插入。
    • 如果改成READ COMMITTED隔离级别,普通SELECT是语句级快照,和PostgreSQL逻辑一致,查询开始后的插入也不会被返回。
    • 要是用SELECT ... FOR UPDATE/SELECT ... LOCK IN SHARE MODE这类当前读语句,会读取最新的提交数据,但普通查询不会触发这个逻辑。
  • MyISAM引擎:它采用表级锁,执行SELECT时会给整张表加读锁,插入操作需要写锁,会被阻塞直到SELECT完成。这种情况下你根本没法在SELECT执行过程中完成插入,自然不存在是否被选中的问题。

SQL Server

SQL Server的行为主要看是否启用了读取提交的快照隔离(RCSI):

  • 默认情况下(未启用RCSI),READ COMMITTED隔离级别是基于锁的:SELECT会在读取数据时加共享锁,插入操作需要排它锁,会被阻塞直到SELECT释放锁,所以同样没法在查询执行过程中完成插入,也就看不到新记录。
  • 如果启用了READ_COMMITTED_SNAPSHOT数据库选项,READ COMMITTED隔离级别会使用语句级快照,和PostgreSQL一样,查询启动后的插入记录不在快照范围内,不会被返回。
  • 要是用REPEATABLE READ或SERIALIZABLE隔离级别,都是事务级快照,同样看不到查询执行过程中新增的记录。

内容的提问来源于stack exchange,提问作者David Lomidze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 11:52:51