Tidbによる同一データベース内におけるトランザクションクエリと解析クエリの共存
ことはじめ HTAPワークロード向けのデータベースとしてcockroach dbが有名。最近新たにtidbというのが台頭してきた。 個人的にOLAPとOLTPの両方のワークロードを効率よく捌くことに興味があるのでいろいろと調べてみる。 データベースの基本をまとめる データベースの基本用語説明 トランザクション 一連の処理をまとめたもの。一連の処理単位でコミット(確定)もしくはロールバック(破棄)する。この、一連の処理単位でコミットするかしないかを決めるのが大事。例えば、次のような処理を考える。 トランザクション開始ー>在庫テーブルで保持している商品の在庫を減らす ー> 注文テーブルに購入者情報を登録 ー> トランザクション終了 ここで、ステップ2で在庫テーブルで保持している商品の在庫を減らした後、ステップ3でエラーが発生したとする。 この時、この一連の処理がトランザクション処理として扱われている場合は、エラー発生後、処理開始前までロールバックすることが可能である。 しかし、トランザクション処理がない場合は、ステップ2だけが実行され、一貫性のないデータになってしまう。こういったことを防ぐために「トランザクション処理」が必要となる。 Mysqlで実際にトランザクションを実行するためのSQLを下に示す。 mysql> BEGIN; Query OK, 0 rows affected (0.01 sec) mysql> UPDATE `users` SET `name` = "xxx" WHERE `id` = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) Beginでトランザクションが始まる。最後にROLLBACKしているからこれは破棄される。 mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE `users` SET `name` = "xxx" WHERE `id` = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) これは最後にCOMMITされているので変更が永続化されるわけですね。 ちなみに、BEGINの代わりにSTART TRANSACTIONで初めてもいいです。 ...