2016-12-07 3 views
0

私はsqliteデータベースへのシリアライズされたアクセスを持っています。すべてのスレッドが同じデータベースハンドルを使用しています。sqliteロールバックの理由は何ですか?

sqlite3_config(SQLITE_CONFIG_SERIALIZED)。多くのINSERT文を含むトランザクション文の1の間に

、私は別のスレッドで行を削除しています。どちらも同じテーブルを変更しようとしています。

トランザクションがロールバックされています。私はこれがロールバックの理由であるかどうかを知りたがっていました。

問題を見つけるのを手伝ってもらえますか?前もって感謝します。

よろしく、 ラジーブ

答えて

1

一方の接続1つのトランザクションを持っています。 したがって、複数のスレッドを使用する場合は、スレッドごとに1つの接続を使用する必要があります。

のSQLiteのスレッドモードが破損しになることから、データベースの構造自体を防ぐことができますが、複数のスレッドが同時にデータベースを使用して何かをしようとすると、彼らはまだ互いのデータに干渉します。

+0

あなたは私たちが他のスレッドからのテーブルを変更しようとしている場合、それは矛盾した状態にして、データベースを作ることができると言うことを意味しますか? – snr

+0

データベース自体が関連する限り(つまり、すべての制約が保証されている)、整合性のある状態になります。しかし、あなたのスレッドが同じトランザクションで複数のことをしたり、独自のトランザクションをしようとすると、あなたのプログラムでは結果が正しくない可能性があります。 –

+0

このSQLite_CONFIG_SERIALIZEDが何を行うことができるのか教えてください。私が考えたのは、このオプションを有効にすると、同時にデータベースを更新できないということです。そして、トランザクションの開始時に、sqliteはデータベースファイルへのファイルハンドルロック権を持っていますか?次に、このオプションでどのように並列削除が可能ですか? – snr

関連する問題