在PDO事务中INSERT后执行SELECT,能否查询到刚插入的变更数据?
结论
同一个数据库连接的同一个事务内,步骤4的SELECT查询必然可以读到步骤3刚插入的全部数据。
原因解释
这是所有支持事务的关系型数据库(MySQL、PostgreSQL等)都遵循的基础规则:本事务内部产生的未提交写入操作,对本事务的所有后续操作完全可见,不受事务隔离级别配置的影响。
事务隔离级别只会限制当前事务能不能读到其他事务的未提交/已提交数据,完全不会干涉同一个事务内部的操作可见性。
需要额外注意的是,只有在同一个PDO连接、同一个未提交的事务内才符合这个规则,如果中途新建了其他PDO连接执行查询,就会读不到未提交的插入数据。
额外优化建议
你当前的流程是先全量插入再查重再删除,数据量大的时候性能损耗比较高,可以考虑两种优化方案:
- 给需要去重的字段加上唯一索引,插入时直接使用
INSERT IGNORE或者ON DUPLICATE KEY UPDATE语法,直接在插入阶段就避免重复数据写入 - 插入前在PHP层先对要插入的数千条数据做一次去重预处理,减少后续数据库操作的压力
内容的提问来源于stack exchange,提问作者Grumbunks
相关产品推荐
相关产品推荐

