トランザクション処理_2(SQLiteを学ぶ_23)

SQLiteを学んでいこうという連載の23回目です。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、トランザクション処理をご紹介しました。簡単な例もご紹介しました。

今回もトランザクション処理です。データベースは複数個所からアクセスされることが多いのですが、そんな時、トランザクション処理はどのように作用するのでしょうか。

複数個所からのアクセス

それでは実査に複数個所からのアクセス時の動作を確認してみましょう。まずはAnaconda PromptからSQLte3(処理A)を起動して、以下を実行します。データベースファイルは新規作成とします。

処理A
sqlite> .mode qbox
sqlite> .open C:/Work/db_sample.db
sqlite> CREATE TABLE sample(id INTEGER,name TEXT,age INTEGER);
sqlite> INSERT INTO sample VALUES(1,"TANAKA",25);

データベースファイルには1つのレコードが追加されました。 続いて別途Anaconda Promptを起動してこちらもSQLite3(処理B)を起動します。続いて以下を実行してみましょう。

処理B
sqlite> .mode qbox
sqlite> .open C:/Work/db_sample.db
sqlite> INSERT INTO sample VALUES(2,"YAMADA",30);
sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
└────┴──────────┴─────┘

レコードの追加もできていますし、処理Aで入力した内容にアクセスできています。

それでは処理A側で以下を実行してみましょう。

処理A
sqlite> BEGIN TRANSACTION;
sqlite> INSERT INTO sample VALUES(3,"OOTA",27);
sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
│ 3  │ 'OOTA'   │ 27  │
└────┴──────────┴─────┘

トランザクション処理を開始してからレコードを1件書き込んでいます。

この状態で処理Bからアクセスしてみましょう。以下を実行してみます。

処理B
sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
└────┴──────────┴─────┘
sqlite> INSERT INTO sample VALUES(4,"MURAYAMA",22);
Runtime error: database is locked (5)

処理Aで追加したレコードは確認できません。また、処理Bからのレコード追加はエラーとなり、できなくなっています。このようにトランザクション処理を実行すると、そのほかの接続からはアクセスを制限できます。

処理Aでのトランザクション処理を終了してみましょう。

処理A
sqlite> COMMIT TRANSACTION;

処理B側で確認してみましょう。

処理B
sqlite> SELECT * FROM sample;
┌────┬──────────┬─────┐
│ id │   name   │ age │
├────┼──────────┼─────┤
│ 1  │ 'TANAKA' │ 25  │
│ 2  │ 'YAMADA' │ 30  │
│ 3  │ 'OOTA'   │ 27  │
└────┴──────────┴─────┘
sqlite> INSERT INTO sample VALUES(4,"MURAYAMA",22);
sqlite> SELECT * FROM sample;
┌────┬────────────┬─────┐
│ id │    name    │ age │
├────┼────────────┼─────┤
│ 1  │ 'TANAKA'   │ 25  │
│ 2  │ 'YAMADA'   │ 30  │
│ 3  │ 'OOTA'     │ 27  │
│ 4  │ 'MURAYAMA' │ 22  │
└────┴────────────┴─────┘

処理Aで追加したレコードが確認できました。処理Bからのレコード追加もできました。

次回はPythonでのエラー処理

いかがでしょうか。こうやって動かしていくとトランザクションの仕組みがわかってきますよね。次回はPythonでのエラー処理です。楽しみに!!

hirocom777.hatenadiary.org

SQLite学習記事のまとめですはこちらから