为什么我的 Amazon Redshift 查询状态从“已完成”变为“已中止”,却没有进行任何更改?

1 分钟阅读
0

Amazon Redshift 控制台显示查询状态为“已完成”,但随后状态更改为“已中止”。但是,当我查询上一次会话或交易的结果时,该表没有更新。

概述

在提交事务之前,操作数据或创建数据库对象的 SQL 语句不会持续存在。这不适用于隐式执行提交TRUNCATE 语句。

如果 SQL 语句仍处于未完成的事务中,则 Amazon Redshift 控制台会将该语句的查询状态显示为“已完成”。如果事务被回滚,状态将更改为“已中止”。STL_QUERY 系统表还显示,当中止的列值为 0 时,语句已成功完成SQL 语句。

如果稍后提交了事务,则会显示更改。但是,如果无法提交交易,则 Amazon Redshift 控制台会显示查询已中止。若要确定无法提交交易的原因,请查看 STL 系统表。

解决方法

若要确认事务是已提交还是已回退,请在 SVL_STATEMENTTEXT 系统表上使用以下查询的输出。然后,按 SQL 语句的事务 ID(xid)进行筛选:

SELECT *
FROM SVL_STATEMENTTEXT
WHERE xid IN (SELECT xid FROM STL_QUERY WHERE query = [Query ID]) ORDER BY starttime, sequence;

查询的输出为回滚事务显示“正在撤消 1 个事务”语句。

如果事务以 BEGIN 语句开头,则表示语句是由用户或应用程序显式打开的。语句也必显式提交。不是使用 BEGIN 语句启动的事务通常由 SQL 客户端或驱动程序的“自动提交”选项自动提交。如果禁用该选项,则用户必须显式发送 COMMIT。

正确提交事务后,事务的更改将是持久的(持续存在),可以被在 COMMIT 语句之后启动的其他 XID 看到。有关详细信息,请参阅可序列化隔离

如果在 SVL_STATEMENTTEXT 系统表上没有看到 END、COMMIT 或“正在撤消 1 个事务”消息时,表示 XID 可能仍处于打开状态。使用 SVV_TRANSACTIONS 视图来识别未完成事务和锁定争用

也可以使用系统表 STL_COMMIT_STATS 和 STL_UNDONE 来确认事务是以提交还是回滚结束。

运行以下查询可了解更改是否已提交:

SELECT q.query, q.xid, NVL2 (cs.endtime, cs.endtime::text, 'NO COMMIT') AS commit_endtime
FROM STL_QUERY q LEFT JOIN STL_COMMIT_STATS cs ON q.xid = cs.xid AND cs.node = -1
WHERE q.query = [QUERY ID];

运行以下查询可了解更改是否已回退:

SELECT *
FROM STL_UNDONE
WHERE xact_id_undone IN (SELECT xid from STL_QUERY where query = [QUERY ID]);

由于显式回滚命令,事务更改不会持续存在,或者更改直到完成才运行。当存在可序列化的隔离违规时,不会发生显式回滚。当管理员终止会话或取消查询时,也不会发生显示回滚。网络连接中的超时也可能使交易变更无法持续。

如果发生回滚,客户端会收到一条包含更多详细信息的错误消息。最佳做法是将您的客户端配置为记录错误。有关更多信息,请参阅配置日志记录(JDBC)或 LogLevel(ODBC)。

相关信息

STL_DDLTEXT

AWS 官方
AWS 官方已更新 1 年前