

# 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 トランザクションを終了させます。値は秒単位で指定します。値がゼロ (デフォルト) の場合、タイムアウトは無効になります。

次の表は、パラメータの詳細をまとめたものです。


| プロパティ | 値 | 
| --- | --- | 
| Name | aurora\_transaction\_timeout | 
| Scope | セッション、グローバル | 
| Default | 0 (無効) | 
| Unit | 秒 | 
| Dynamic | はい、新しい 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) および `LOAD DATA` を除くすべての[暗黙的なコミットステートメント](https://dev.mysql.com/doc/refman/8.4/en/implicit-commit.html)は、このタイムアウトの対象外です。タイムアウト値は、最初の 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 (autocommit が無効化された後の最初の 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 の "server gone away" エラーと同様のエラーを受け取ります。詳細については、MySQL ドキュメントの「[MySQL server has gone away](https://dev.mysql.com/doc/refman/8.4/en/gone-away.html)」を参照してください。

## エラーログ
<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` ステータス変数を使用して、DB インスタンスの再起動後にタイムアウトしたトランザクションの数を追跡します。

```
SHOW GLOBAL STATUS LIKE 'Aurora_transaction_timeouts';
```

`performance_schema` を有効にすると、タイムアウトエラー (`ER_AURORA_TRANSACTION_TIMEOUT_ERROR`) は `performance_schema.events_errors_summary_global_by_error` および関連するテーブルでも追跡されます。このカウンターが増加するのはアクティブなトランザクションのタイムアウト時のみであることに注意してください。アイドル状態のトランザクションがタイムアウトした場合は、`ER_AURORA_TRANSACTION_TIMEOUT_ERROR` エラーを発生させることなく接続が終了します。

## 他のタイムアウトとの相互作用
<a name="AuroraMySQL.TransactionTimeout.interaction"></a>

`aurora_transaction_timeout` は、既存のタイムアウトパラメータと連携して機能します。トランザクションが設定された `aurora_transaction_timeout` の時間を超えて開いたままである場合、他のタイムアウト設定に関係なく終了させられます。他のタイムアウトによってトランザクションがロールバックされるかどうかは、それぞれの実装に依存します。これらのパラメータの詳細については、MySQL のドキュメントを参照してください。