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

Sql 了解Snowflake中的锁和查询状态(对单个表进行多次更新),sql,sqlalchemy,locking,snowflake-cloud-data-platform,Sql,Sqlalchemy,Locking,Snowflake Cloud Data Platform,当使用python连接器对snowflake进行表单查询时 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 tra

当使用python连接器对snowflake进行表单查询时

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中看到查询历史时,它表示查询已成功完成(成功状态),但实际上,更新从未发生,因为表没有改变

所以根据我用的

选择系统$ABORT_事务();

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


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

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


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

更新、删除和合并不能在单个表上同时运行;它们将被序列化,因为一次只有一个用户可以锁定一个表。其他人将在“阻塞”状态下排队,直到轮到他们取锁为止。在单个锁上可以等待的查询数量有限制

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


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

你好,塞尔吉奥,你找到锁的原因了吗?对我来说,当同一个表上发生多个更新时(当同一个请求被多次执行时),请求也会被“阻止”,如图所示。