1

SQLite 3 バージョン 3.7.14.1 で問題が発生しています。更新を行ってからすぐにクエリを実行しようとすると、存在しないかのように 0 の結果が返されます。

これが私のログのサンプルです:

SQLiteDB::beginTransaction: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:SELECT ... ID LIKE '2' ...
SQLiteDB::executeStatement: 100
SqlHandler::queryEvent -- Bound results.
SqlHandler::retrieveEvents -- Result set has 1 entries
SQLiteDB::releaseStatement: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:UPDATE ... WHERE ID = '2'
SQLiteDB::executeStatement: 101
SQLiteDB::releaseStatement: 0
SQLiteDB::endTransaction: 0

SQLiteDB::beginTransaction: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:SELECT ... ID LIKE '2' ...
SQLiteDB::executeStatement: 100
SqlHandler::queryEvent -- Bound results.
SqlHandler::retrieveEvents -- Result set has 1 entries
SQLiteDB::releaseStatement: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:UPDATE id = '2'
SQLiteDB::executeStatement: 101
SQLiteDB::releaseStatement: 0
SQLiteDB::endTransaction: 0

SQLiteDB::beginTransaction: 0
SQLiteDB::prepareStatement: 0
SQLiteDB::executeStatement -- Executing SQL query:SELECT ... ID LIKE '2' ...
SQLiteDB::executeStatement: 101
SqlHandler::queryEvent -- Nothing found.
SQLiteDB::releaseStatement: 0
Accessor::query -- Unable to perform query. queryEvent failed.
SQLiteDB::endTransaction: 0

「3」で更新を行い、「2」を選択すると問題はありませんが、「2」を更新して「2」を選択した場合 (または同じレコードで UPDATE と SELECT を実行した場合) のみです。

更新された情報はすべて正しいですが、操作の間に小さなスリープまたはブレークを配置しない限り、選択は失敗します (連続して実行することはできません)。

私はマルチスレッド、共有キャッシュ、および複数の接続を使用しています

sqlite3_config(SQLITE_CONFIG_SERIALIZED);

sqlite3_enable_shared_cache(true);

sqlite3_open("file::memory:?cache=shared", &hDBC_);

助けてくれてありがとう。

編集:私が使用している開始および終了トランザクションについて

sqlite3_exec

私が使用しているクエリ、挿入、削除、更新の準備ステートメントについて

sqlite3_prepare_v2

私が使用しているexecuteステートメントについて

sqlite3_step

私が使用しているリリースステートメントについて

sqlite3_finalize
4

1 に答える 1

0

助けてくれてありがとう。

問題は私のクエリにありました。特定のレコードが更新されるたびに「last_modified」フィールドを更新するトリガーがあります。私のクエリには、... last_modified < current_timestamp という where 句があります。そのため、クエリと同じ 1 秒間隔で更新が発生した場合、それらは削除されました。問題は、タイムスタンプの精度が 1 であることを理解していなかったことです。

もう一度、すべての助けに感謝します

于 2013-03-14T13:57:15.407 に答える