質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

4465閲覧

SQLiteの排他制御について(複数プロセスから同一ファイルにアクセスする)

Taffy

総合スコア33

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2022/08/01 02:57

前提

Raspberry Pi を使用してWebアプリケーションを作成しています。
Webアプリケーションのため、言語はPython (Django)、一部C++で作成のプロセスを実行して値取得をしています。
DBはSQLiteを使用しています。
このDBには、Webアプリケーション側(Python)と Webアプリケーションから呼び出されるプロセス(C++)の
両方からアクセスします。 (SELECT, UPDATE)

実現したいこと

特に排他制御を意識して作成されていなかったため、「database is locked」というエラーメッセージが頻繁に出ます。
Python、C++の両方に排他制御を入れて、DBのロックによる異常が発生しないようにしたいです。
一方が使用中で UPDATEができない場合は、あとからアクセスしたほうが 待機するような形にしたい)

発生している問題・エラーメッセージ

「database is locked」というエラーメッセージが頻繁に出ています。

試したこと

DBの設定を共有ロック可能にしました。

C++

1 int ret = sqlite3_open_v2("DB.sqlite3",&db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE,NULL );

Python

1 con = sqlite3.connect("DB.sqlite3", isolation_level='IMMEDIATE')

しかし、このケースでも 同一テーブルにアクセスし、一方がUPDATE処理実行中であれば
「database is locked」となってしまうのではないかと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SQLiteにはselect for updateは無いので、自前でWAITするか、ユーティリティ関数を使うかの何れかかと思います。

以下参考
SQLite のロックによる SQLITE_BUSY に備える
SQLiteでSQLITE_BUSYが返ってくる

投稿2022/08/01 04:04

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Taffy

2022/08/04 03:46

回答ありがとうございます。 timeoutを入れるようにして、仕様通りの頻度で更新できるか確認してみたいと思います。 後程結果はコメントします。
Taffy

2022/08/04 06:19

以下のようにして、タイムアウトを入れたところ、ロックエラーは発生しなくなりました。 con = sqlite3.connect("XXXXX.db", isolation_level='IMMEDIATE',timeout=3000) どの処理も3秒以上動作することはないため、この方法で問題ないと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問