📣

TiDB Cloud Serverless が
Starter
に変わりました!このページは自動翻訳されたものです。
原文はこちらからご覧ください。

トランザクションの概要

Oreoxmt

TiDBは完全な分散トランザクションをサポートし、 楽観的取引悲観的取引 (TiDB 3.0で導入)を提供します。この記事では主に、トランザクションステートメント、楽観的トランザクションと悲観的トランザクション、トランザクション分離レベル、そして楽観的トランザクションにおけるアプリケーション側の再試行とエラー処理について紹介します。

よくある発言

この章では、TiDBにおけるトランザクションの使い方を紹介します。以下の例は、単純なトランザクションの処理を示しています。

ボブはアリスに20ドルを送金したいと考えています。この取引には2つの操作が含まれます。

  • ボブの口座残高は 20 ドル減少します。
  • アリスの口座残高は 20 ドル増加しました。

トランザクションにより、上記の操作の両方が正常に実行されるか、または両方とも失敗するかを確認できます。

書店データベースのusersテーブルを使用して、テーブルにサンプル データを挿入します。

INSERT INTO users (id, nickname, balance) VALUES (2, 'Bob', 200); INSERT INTO users (id, nickname, balance) VALUES (1, 'Alice', 100);

次のトランザクションを実行し、各ステートメントの意味を説明します。

BEGIN; UPDATE users SET balance = balance - 20 WHERE nickname = 'Bob'; UPDATE users SET balance = balance + 20 WHERE nickname= 'Alice'; COMMIT;

上記のトランザクションが正常に実行されると、テーブルは次のようになります。

+----+--------------+---------+ | id | account_name | balance | +----+--------------+---------+ | 1 | Alice | 120.00 | | 2 | Bob | 180.00 | +----+--------------+---------+

取引を開始する

新しいトランザクションを明示的に開始するには、 BEGINまたはSTART TRANSACTIONいずれかを使用できます。

BEGIN;
START TRANSACTION;

TiDBのデフォルトのトランザクションモードは悲観的です。1 楽観的取引モデル明示的に指定することもできます。

BEGIN OPTIMISTIC;

悲観的トランザクションモードを有効にする:

BEGIN PESSIMISTIC;

上記のステートメントが実行されたときに現在のセッションがトランザクションの途中である場合、TiDB はまず現在のトランザクションをコミットし、次に新しいトランザクションを開始します。

トランザクションをコミットする

COMMITステートメントを使用すると、現在のトランザクションで TiDB によって行われたすべての変更をコミットできます。

COMMIT;

楽観的トランザクションを有効にする前に、アプリケーションがCOMMIT文によって返される可能性のあるエラーを適切に処理できることを確認してください。アプリケーションがどのように処理するか不明な場合は、代わりに悲観的トランザクションモードを使用することをお勧めします。

トランザクションをロールバックする

ROLLBACKステートメントを使用して、現在のトランザクションの変更をロールバックできます。

ROLLBACK;

前の転送の例では、トランザクション全体をロールバックすると、アリスとボブの残高は変更されず、現在のトランザクションのすべての変更がキャンセルされます。

TRUNCATE TABLE `users`; INSERT INTO `users` (`id`, `nickname`, `balance`) VALUES (1, 'Alice', 100), (2, 'Bob', 200); SELECT * FROM `users`; +----+--------------+---------+ | id | nickname | balance | +----+--------------+---------+ | 1 | Alice | 100.00 | | 2 | Bob | 200.00 | +----+--------------+---------+ BEGIN; UPDATE `users` SET `balance` = `balance` - 20 WHERE `nickname`='Bob'; UPDATE `users` SET `balance` = `balance` + 20 WHERE `nickname`='Alice'; ROLLBACK; SELECT * FROM `users`; +----+--------------+---------+ | id | nickname | balance | +----+--------------+---------+ | 1 | Alice | 100.00 | | 2 | Bob | 200.00 | +----+--------------+---------+

クライアント接続が停止または閉じられた場合も、トランザクションは自動的にロールバックされます。

トランザクション分離レベル

トランザクション分離レベルは、ACIDのトランザクション処理の基礎となります。ACIDの「I」(Isolation)は、トランザクションの分離を意味します。

SQL-92 標準では、次の 4 つの分離レベルが定義されています。

  • コミットされていない読み取り ( READ UNCOMMITTED )
  • コミットされた読み取り ( READ COMMITTED )
  • 繰り返し読み取り ( REPEATABLE READ )
  • シリアル化可能( SERIALIZABLE )。

詳細については、以下の表を参照してください。

分離レベルダーティライトダーティリードファジーリードファントム
READ UNCOMMITTED不可能可能可能可能
READ COMMITTED不可能不可能可能可能
REPEATABLE READ不可能不可能不可能可能
SERIALIZABLE不可能不可能不可能不可能

TiDB は次の分離レベルをサポートしています: READ COMMITTEDREPEATABLE READ :

mysql> SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; ERROR 8048 (HY000): The isolation level 'READ-UNCOMMITTED' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error mysql> SET TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; Query OK, 0 rows affected (0.00 sec) mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; ERROR 8048 (HY000): The isolation level 'SERIALIZABLE' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error

TiDBは、MySQLとの一貫性を保つため、スナップショット分離(SI)レベルの一貫性(「繰り返し読み取り」とも呼ばれます)を実装しています。この分離レベルはANSI繰り返し読み取り分離レベルおよびMySQL 繰り返し読み取り分離レベルとは異なります。詳細については、 TiDBトランザクション分離レベル参照してください。

ヘルプが必要ですか?

不和またはスラック 、あるいはサポートチケットを送信するについてコミュニティに質問してください。

このページは役に立ちましたか?