

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon Aurora MySQL 中的交易逾時
<a name="AuroraMySQL.TransactionTimeout"></a>

`aurora_transaction_timeout` 參數會設定交易的持續時間上限。此參數有助於防止長時間執行的交易 （作用中或閒置） 封鎖 [InnoDB 清除](https://dev.mysql.com/doc/refman/8.4/en/glossary.html#glos_purge)，這可能會導致效能問題。此參數適用於 Aurora MySQL 8.4.8 版及更新版本。

**Topics**
+ [參數詳細資訊](#AuroraMySQL.TransactionTimeout.parameter-details)
+ [逾時行為](#AuroraMySQL.TransactionTimeout.behavior)
+ [範例](#AuroraMySQL.TransactionTimeout.examples)
+ [主要備註](#AuroraMySQL.TransactionTimeout.key-notes)
+ [用戶端錯誤](#AuroraMySQL.TransactionTimeout.client-error)
+ [錯誤日誌](#AuroraMySQL.TransactionTimeout.error-log)
+ [監控交易逾時](#AuroraMySQL.TransactionTimeout.monitoring)
+ [與其他逾時的互動](#AuroraMySQL.TransactionTimeout.interaction)

## 參數詳細資訊
<a name="AuroraMySQL.TransactionTimeout.parameter-details"></a>

`aurora_transaction_timeout` 參數會終止超過指定持續時間的任何 InnoDB 交易，包括唯讀交易。您可以指定以秒為單位的值。值為零 （預設值） 會停用逾時。

下表摘要說明參數詳細資訊。


| 屬性 | Value | 
| --- | --- | 
| 名稱 | aurora\_transaction\_timeout | 
| Scope (範圍) | 工作階段、全域 | 
| 預設 | 0 （已停用） | 
| 單位 | 秒鐘 | 
| 動態 | 是，僅適用於新的 InnoDB 交易 | 

您可以在叢集、執行個體或工作階段層級設定 `aurora_transaction_timeout` 參數。如需使用參數群組的詳細資訊，請參閱[Amazon Aurora 的參數群組](USER_WorkingWithParamGroups.md)。

## 逾時行為
<a name="AuroraMySQL.TransactionTimeout.behavior"></a>

`aurora_transaction_timeout` 參數適用於執行 DML 陳述式的 InnoDB 交易，包括唯讀交易。除了 `CREATE TABLE .. AS SELECT`(CTAS) 和 之外，所有[隱含遞交陳述](https://dev.mysql.com/doc/refman/8.4/en/implicit-commit.html)`LOAD DATA`式都會從逾時中排除。逾時值會在第一個 InnoDB 陳述式執行時擷取。該值在該交易的生命週期內保持固定。

當逾時過期時，結果取決於交易狀態：
+ 如果交易中有作用中的查詢，查詢會中斷並復原交易。連線仍然可用。
+ 如果沒有作用中的查詢 （也就是交易閒置），則會終止連線。

## 範例
<a name="AuroraMySQL.TransactionTimeout.examples"></a>

下列範例顯示計時器在不同交易案例的開始時間。

### 明確交易
<a name="AuroraMySQL.TransactionTimeout.examples.explicit"></a>

```
BEGIN;                    -- Does NOT start InnoDB transaction. No timer.
SELECT * FROM t1;         -- Starts InnoDB transaction. Timer starts HERE (at statement 2).
```

計時器從陳述式 2 （第一個 InnoDB 陳述式） 開始。

### autocommit=0
<a name="AuroraMySQL.TransactionTimeout.examples.autocommit"></a>

```
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 陳述式）。

### 預存程序
<a name="AuroraMySQL.TransactionTimeout.examples.stored-procs"></a>

預存程序會在發起人的交易內容中執行。如果發起人已經有作用中的 InnoDB 交易，計時器已在程序呼叫之前啟動。如果程序是第一個觸碰 InnoDB 的物件，計時器會從程序內的第一個 InnoDB 陳述式開始。

```
BEGIN;
CALL my_proc();  -- If my_proc() does SELECT/INSERT, timer starts at that first InnoDB statement inside the proc
```

## 主要備註
<a name="AuroraMySQL.TransactionTimeout.key-notes"></a>
+ **逾時會在交易開始時擷取** – 逾時值會在第一個 InnoDB 陳述式執行時擷取。在交易`aurora_transaction_timeout`過程中變更會對下一個交易生效，而不是目前的交易。不會引發警告。
+ **XA PREPARED 交易已排除** – 準備的交易不受 約束`aurora_transaction_timeout`。
+ **寫入轉送工作階段不受交易逾時限制** – 啟用寫入轉送時，任何包含轉送陳述式的陳述式或交易都不受 約束`aurora_transaction_timeout`。在不包含轉送陳述式的相同工作階段上，後續交易會如常發生逾時。若要控制轉送交易的閒置逾時，您可以使用 `aurora_fwd_writer_idle_timeout` 參數。如需詳細資訊，請參閱[Aurora MySQL 中寫入轉送的組態參數](aurora-global-database-write-forwarding-ams.md#aurora-global-database-write-forwarding-params-ams)。
+ **使用高逾時值時請小心** – 復原長時間執行的交易時，復原可能需要比原始資料變更操作長數倍的時間。刪除資料庫程序沒有幫助，因為回復會在伺服器啟動時重新啟動。選擇可平衡工作負載需求與轉返成本的逾時值。如需詳細資訊，請參閱 MySQL 文件中的[最佳化 InnoDB 交易管理](https://dev.mysql.com/doc/refman/8.4/en/optimizing-innodb-transaction-management.html)。

## 用戶端錯誤
<a name="AuroraMySQL.TransactionTimeout.client-error"></a>

當具有作用中查詢的交易超過逾時時，用戶端會收到下列錯誤：

```
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 伺服器已消失](https://dev.mysql.com/doc/refman/8.4/en/gone-away.html)。 MySQL 

## 錯誤日誌
<a name="AuroraMySQL.TransactionTimeout.error-log"></a>

發生交易逾時時，會將資訊性訊息寫入資料庫錯誤日誌：

```
[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
```

**注意**  
此日誌訊息僅用於診斷目的。依賴用戶端回應做為逾時交易的最終指標。

## 監控交易逾時
<a name="AuroraMySQL.TransactionTimeout.monitoring"></a>

使用 `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`錯誤。

## 與其他逾時的互動
<a name="AuroraMySQL.TransactionTimeout.interaction"></a>

`aurora_transaction_timeout` 可與現有的逾時參數搭配使用。如果交易保持開啟的時間超過設定的 `aurora_transaction_timeout`，則無論其他逾時設定為何，都會終止交易。其他逾時是否也會復原交易，取決於其自身實作。如需這些參數的詳細資訊，請參閱 MySQL 文件。