了解 Snowflake 中的锁和查询状态(对单个 table 的多次更新)
Understanding locks and query status in Snowflake (multiple updates to a single table)
使用 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
这通常发生在多个查询试图更新单个 table 时。我不明白的是,当我在 Snowflake 中看到查询历史记录时,它说查询成功完成(成功状态)但实际上,更新从未发生过,因为 table 没有改变。
所以根据https://community.snowflake.com/s/article/how-to-resolve-blocked-queries我用了
SELECT SYSTEM$ABORT_TRANSACTION(<transaction_id>);
释放锁,但仍然没有任何反应,甚至在成功状态下查询似乎根本没有执行。所以我的问题是,这到底是如何工作的以及如何在不丢失查询执行的情况下释放锁(另外,由于锁而排队的其他 20 多个查询会发生什么情况,有时似乎当锁被释放,下一个获得锁并且也必须被中止)。
如果你能帮助我,我将不胜感激。谢谢!
不确定塞尔吉奥是否得到了答案。本例中的问题不在于 table。根据我对雪花的经验,以下是我的理解。
在雪花中,每个 table 操作还涉及元 table 的变化,它跟踪微分区、最小和最大。默认情况下,此元 table 仅支持 20 个并发 DML 语句。因此,如果 table 不断更新并命中同一分区,则有可能超过此限制。在这种情况下,我们应该考虑重新设计 table updation/insertion 逻辑。在我们的一个用例中,在与雪花支持团队交谈后,我们将限制增加到 50
UPDATE、DELETE 和 MERGE 不能在单个 table 上同时 运行;它们将被序列化,因为一次只有一个人可以锁定 table。其他人会以“阻塞”状态排队,直到轮到他们拿锁。可以等待单个锁的查询数量是有限制的。
如果您看到更新成功完成但没有在 table 中看到更新的数据,那么您很可能没有提交您的交易。确保在更新后 运行 COMMIT
,以便将新数据提交到 table 并释放锁。
或者,您可以确保启用 AUTOCOMMIT,这样 DML 将在完成后自动提交。您可以在任何要 运行 更新的会话中使用 ALTER SESSION SET AUTOCOMMIT=TRUE;
启用它。
使用 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
这通常发生在多个查询试图更新单个 table 时。我不明白的是,当我在 Snowflake 中看到查询历史记录时,它说查询成功完成(成功状态)但实际上,更新从未发生过,因为 table 没有改变。
所以根据https://community.snowflake.com/s/article/how-to-resolve-blocked-queries我用了
SELECT SYSTEM$ABORT_TRANSACTION(<transaction_id>);
释放锁,但仍然没有任何反应,甚至在成功状态下查询似乎根本没有执行。所以我的问题是,这到底是如何工作的以及如何在不丢失查询执行的情况下释放锁(另外,由于锁而排队的其他 20 多个查询会发生什么情况,有时似乎当锁被释放,下一个获得锁并且也必须被中止)。
如果你能帮助我,我将不胜感激。谢谢!
不确定塞尔吉奥是否得到了答案。本例中的问题不在于 table。根据我对雪花的经验,以下是我的理解。
在雪花中,每个 table 操作还涉及元 table 的变化,它跟踪微分区、最小和最大。默认情况下,此元 table 仅支持 20 个并发 DML 语句。因此,如果 table 不断更新并命中同一分区,则有可能超过此限制。在这种情况下,我们应该考虑重新设计 table updation/insertion 逻辑。在我们的一个用例中,在与雪花支持团队交谈后,我们将限制增加到 50
UPDATE、DELETE 和 MERGE 不能在单个 table 上同时 运行;它们将被序列化,因为一次只有一个人可以锁定 table。其他人会以“阻塞”状态排队,直到轮到他们拿锁。可以等待单个锁的查询数量是有限制的。
如果您看到更新成功完成但没有在 table 中看到更新的数据,那么您很可能没有提交您的交易。确保在更新后 运行 COMMIT
,以便将新数据提交到 table 并释放锁。
或者,您可以确保启用 AUTOCOMMIT,这样 DML 将在完成后自动提交。您可以在任何要 运行 更新的会话中使用 ALTER SESSION SET AUTOCOMMIT=TRUE;
启用它。