本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Aurora MySQL 中的交易逾時
aurora_transaction_timeout 參數會設定交易的持續時間上限。此參數有助於防止長時間執行的交易 (作用中或閒置) 封鎖 InnoDB 清除
參數詳細資訊
aurora_transaction_timeout 參數會終止超過指定持續時間的任何 InnoDB 交易,包括唯讀交易。您可以指定以秒為單位的值。值為零 (預設值) 會停用逾時。
下表摘要說明參數詳細資訊。
| 屬性 | Value |
|---|---|
| 名稱 | aurora_transaction_timeout |
| Scope (範圍) | 工作階段、全域 |
| 預設 | 0 (已停用) |
| 單位 | 秒鐘 |
| 動態 | 是,僅適用於新的 InnoDB 交易 |
您可以在叢集、執行個體或工作階段層級設定 aurora_transaction_timeout 參數。如需使用參數群組的詳細資訊,請參閱Amazon Aurora 的參數群組。
逾時行為
aurora_transaction_timeout 參數適用於執行 DML 陳述式的 InnoDB 交易,包括唯讀交易。除了 CREATE TABLE .. AS SELECT(CTAS) 和 之外,所有隱含遞交陳述LOAD DATA式都會從逾時中排除。逾時值會在第一個 InnoDB 陳述式執行時擷取。該值在該交易的生命週期內保持固定。
當逾時過期時,結果取決於交易狀態:
-
如果交易中有作用中的查詢,查詢會中斷並復原交易。連線仍然可用。
-
如果沒有作用中的查詢 (也就是交易閒置),則會終止連線。
範例
下列範例顯示計時器在不同交易案例的開始時間。
明確交易
BEGIN; -- Does NOT start InnoDB transaction. No timer. SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE (at statement 2).
計時器從陳述式 2 (第一個 InnoDB 陳述式) 開始。
autocommit=0
SET SESSION autocommit=0; -- No transaction yet SELECT * FROM t1; -- Starts InnoDB transaction. Timer starts HERE. INSERT INTO t1 ...; -- Same transaction, timer still running from step 2.
計時器從陳述式 2 開始 (停用自動遞交後的第一個 InnoDB 陳述式)。
預存程序
預存程序會在發起人的交易內容中執行。如果發起人已經有作用中的 InnoDB 交易,計時器已在程序呼叫之前啟動。如果程序是第一個觸碰 InnoDB 的物件,計時器會從程序內的第一個 InnoDB 陳述式開始。
BEGIN; CALL my_proc(); -- If my_proc() does SELECT/INSERT, timer starts at that first InnoDB statement inside the proc
主要備註
-
逾時會在交易開始時擷取 – 逾時值會在第一個 InnoDB 陳述式執行時擷取。在交易
aurora_transaction_timeout過程中變更會對下一個交易生效,而不是目前的交易。不會引發警告。 -
XA PREPARED 交易已排除 – 準備的交易不受 約束
aurora_transaction_timeout。 -
寫入轉送工作階段不受交易逾時限制 – 啟用寫入轉送時,任何包含轉送陳述式的陳述式或交易都不受 約束
aurora_transaction_timeout。在不包含轉送陳述式的相同工作階段上,後續交易會如常發生逾時。若要控制轉送交易的閒置逾時,您可以使用aurora_fwd_writer_idle_timeout參數。如需詳細資訊,請參閱Aurora MySQL 中寫入轉送的組態參數。 -
使用高逾時值時請小心 – 復原長時間執行的交易時,復原可能需要比原始資料變更操作長數倍的時間。刪除資料庫程序沒有幫助,因為回復會在伺服器啟動時重新啟動。選擇可平衡工作負載需求與轉返成本的逾時值。如需詳細資訊,請參閱 MySQL 文件中的最佳化 InnoDB 交易管理
。
用戶端錯誤
當具有作用中查詢的交易超過逾時時,用戶端會收到下列錯誤:
ERROR 63952 (40001): Transaction exceeded maximum allowed duration of <N> seconds and was rolled back. See aurora_transaction_timeout for configuring this behavior.
當閒置交易超過逾時時,後續查詢會收到與 MySQL「伺服器消失」錯誤相同的錯誤。如需詳細資訊,請參閱 MySQL 文件中的 MySQL 伺服器已消失
錯誤日誌
發生交易逾時時,會將資訊性訊息寫入資料庫錯誤日誌:
[Note] Transaction breached timeout threshold and will be rolled back, if still in progress. If idle, the connection will be aborted. Check response for confirmation. connection_id: 4821, trx_id: 28193, user: app_user, timeout: 5 seconds, duration: 7 seconds
注意
此日誌訊息僅用於診斷目的。依賴用戶端回應做為逾時交易的最終指標。
監控交易逾時
使用 Aurora_transaction_timeouts 狀態變數來追蹤資料庫執行個體重新啟動後已逾時的交易數量。
SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';
啟用 performance_schema 時,也會在 performance_schema.events_errors_summary_global_by_error和相關資料表中追蹤逾時錯誤 (ER_AURORA_TRANSACTION_TIMEOUT_ERROR)。請注意,只有作用中的交易逾時會增加此計數器;閒置的交易逾時會終止連線,而不會引發ER_AURORA_TRANSACTION_TIMEOUT_ERROR錯誤。
與其他逾時的互動
aurora_transaction_timeout 可與現有的逾時參數搭配使用。如果交易保持開啟的時間超過設定的 aurora_transaction_timeout,則無論其他逾時設定為何,都會終止交易。其他逾時是否也會復原交易,取決於其自身實作。如需這些參數的詳細資訊,請參閱 MySQL 文件。