如何在Snowflake中基于同一隔离表快照执行两条SELECT语句?隔离级别咨询
Snowflake 快照读取与事务隔离问题解答
1. 实现同一快照读取的正确方式
把两条SELECT语句放到同一个显式事务中即可,代码示例如下:
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 第一条查询 SELECT * FROM your_target_table WHERE your_condition; -- 第二条查询,将复用事务启动时的同一数据快照 SELECT COUNT(*) FROM your_target_table WHERE another_condition; COMMIT;
Snowflake会在事务启动时生成一个数据快照,事务内所有SELECT操作都会基于这个快照读取,完全忽略事务执行期间其他会话对表的写入操作。
2. Snowflake 是否支持 Snapshot Isolation?
官方文档明确只标注支持READ COMMITTED这一种隔离级别,但它的READ COMMITTED实现逻辑和标准的Snapshot Isolation完全等价:事务内所有读取操作都基于事务启动时刻的数据版本,不会看到事务执行过程中其他事务提交的修改。社区里说“支持Snapshot Isolation”,其实是指它的READ COMMITTED实际表现符合Snapshot Isolation的特性,只是官方没有用这个命名而已。
3. 同一事务内的两条SELECT能否保证读取相同数据?
完全可以。只要是在同一个显式事务中执行的SELECT语句,不管两条查询之间有多少外部写入操作,都会使用事务启动时生成的统一数据快照,两条查询的结果必然基于同一版本的数据,不会出现不一致的情况。
内容的提问来源于stack exchange,提问作者Gopick
相关产品推荐
相关产品推荐

