取引
TiDB は完全な分散トランザクションを提供し、モデルにはGoogle パーコレーターに基づいたいくつかの最適化が施されています。
楽観的トランザクションモード
TiDB の楽観的トランザクション モデルでは、コミット フェーズまで競合を検出しません。競合がある場合、トランザクションは再試行する必要があります。ただし、競合が深刻な場合は、再試行前の操作が無効になり、繰り返す必要があるため、このモデルは非効率的です。
データベースをカウンターとして使用すると仮定します。アクセスの同時実行性が高いと、深刻な競合が発生し、再試行が複数回行われたり、タイムアウトになったりする可能性があります。したがって、深刻な競合が発生するシナリオでは、悲観的トランザクション モードを使用するか、Redis にカウンターを配置するなど、システムアーキテクチャレベルで問題を解決することをお勧めします。ただし、アクセスの競合がそれほど深刻でない場合は、楽観的トランザクション モデルが効率的です。
詳細についてはTiDB 楽観的トランザクションモデル参照してください。
悲観的なトランザクションモード
TiDB では、悲観的トランザクション モードの動作は MySQL とほぼ同じです。トランザクションは実行フェーズでロックを適用し、競合状況での再試行を回避して、より高い成功率を保証します。悲観的ロックを適用することで、 SELECT FOR UPDATE
使用して事前にデータをロックすることもできます。
ただし、アプリケーション シナリオの競合が少ない場合は、楽観的トランザクション モデルの方がパフォーマンスが向上します。
詳細についてはTiDB 悲観的トランザクションモード参照してください。
トランザクション分離レベル
トランザクション分離は、データベース トランザクション処理の基礎の 1 つです。分離は、トランザクションの 4 つの主要なプロパティの 1 つです (一般にACIDと呼ばれます)。
TiDB は、MySQL との互換性のためにREPEATABLE-READ
として宣伝されているスナップショット分離 (SI) 一貫性を実装しています。これはANSI 繰り返し読み取り分離レベルおよびMySQL 繰り返し読み取りレベルとは異なります。
詳細についてはTiDBトランザクション分離レベル参照してください。
非トランザクションDMLステートメント
非トランザクション DML ステートメントは、複数の SQL ステートメント (つまり、複数のバッチ) に分割され、順番に実行される DML ステートメントです。トランザクションの原子性と分離性を犠牲にして、バッチ データ処理のパフォーマンスと使いやすさを向上させます。
通常、メモリを消費するトランザクションは、トランザクション サイズの制限を回避するために複数の SQL ステートメントに分割する必要があります。非トランザクション DML ステートメントは、このプロセスを TiDB カーネルに統合して、同じ効果を実現します。SQL ステートメントを分割することで、非トランザクション DML ステートメントの効果を理解するのに役立ちます。1 DRY RUN
を使用して、分割されたステートメントをプレビューできます。
詳細については非トランザクションDMLステートメント参照してください。