了解Snowflake中的锁和查询状态(对单个表进行多次更新)

问题描述 投票:0回答:3

使用 python 连接器进行雪花查询时

UPDATE X.TABLEY SET STATUS = %(status)s, STATUS_DETAILS = %(status_details)s WHERE ID = %(entry_id)s

,有时我会收到以下消息:

 (snowflake.connector.errors.ProgrammingError) 000625 (57014): Statement 'X' has locked table 'XX' in transaction 1588294931722 and this lock has not yet been released.

不久之后

Your statement X' was aborted because the number of waiters for this lock exceeds the 20 statements limit

当多个查询尝试更新单个表时,通常会发生这种情况。我不明白的是,当我在 Snowflake 中看到查询历史记录时,它说查询已成功完成(成功状态),但实际上,更新从未发生,因为表没有更改。

所以根据https://community.snowflake.com/s/article/how-to-resolve-blocked-queries我使用了

SELECT SYSTEM$ABORT_TRANSACTION(<transaction_id>);

释放锁,但仍然没有发生任何事情,即使处于成功状态,查询似乎也根本没有执行。所以我的问题是,这到底是如何工作的,以及如何在不丢失查询执行的情况下释放锁(另外,由于锁而排队的其他 20 多个查询会发生什么,有时似乎当锁被释放,下一个获取锁并且也必须中止)。

如果您能帮助我,我将不胜感激。谢谢!

sql sqlalchemy locking snowflake-cloud-data-platform
3个回答
3
投票

不确定塞尔吉奥是否得到了答案。在这种情况下,问题不在于表。根据我对雪花的经验,以下是我的理解。

在雪花中,每个表操作还涉及元表的更改,该元表跟踪微分区、最小和最大分区。该元表默认仅支持 20 个并发 DML 语句。因此,如果表不断更新并在同一分区上命中,则有可能超出此限制。在这种情况下,我们应该考虑重新设计表更新/插入逻辑。在我们的一个用例中,在与雪花支持团队交谈后,我们将限制增加到 50


1
投票

UPDATE、DELETE、MERGE 不能在单个表上同时运行;它们将被序列化,因为一次只有一个人可以锁定一张表。其他人将以“阻塞”状态排队,直到轮到他们获得锁。可以等待单个锁的查询数量是有限制的。

如果您看到更新成功完成,但在表中没有看到更新的数据,那么您很可能没有提交事务。确保在更新后运行

COMMIT
,以便将新数据提交到表并释放锁。

或者,您可以确保启用 AUTOCOMMIT,以便 DML 在完成后自动提交。您可以在任何要运行更新的会话中使用

ALTER SESSION SET AUTOCOMMIT=TRUE;
启用它。


0
投票

此时,我想知道 HYBRID TABLES 是否应该在设计层面解决此类问题,因为它提供行锁定而不是雪花常规表中的表锁定,请查看下面的文档链接:

雪花 - 混合表

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.