1

SqliteConnection BeginTransaction()呼び出しを発行した後、予約ロックが有効になり、書き込みのブロックが開始されるのでしょうか。

予約ロックは実際のBeginTransaction呼び出しに対応していますか、それともCommitが呼び出されてトランザクションが実行された後でのみですか?

既存のデータアクセス層を活用するためにb/cに依頼し、競合状態を防ぐためにカスタムトランザクションが必要になるたびにカスタムトランザクションを作成する必要がないように、BeginTransaction()を呼び出してから、既存のSelect/Insert / Updateラッパーを組み合わせて、排他的な書き込みアクセス権を持ちながら、目前の問題を解決してから、最後にCommitを呼び出します。私が避けようとしている競合状態を防ぐために、BeginTransactionを呼び出すと、トランザクションの予約ロックが「すぐに」(つまり、戻る前に)アクティブになる必要があります。

さらに詳しい説明や詳細が必要な場合は、お知らせください。喜んで提供させていただきます。専門知識をありがとうございます。

4

1 に答える 1

2

ドキュメントには次のように書かれています。

データベースに対する最初の読み取り操作はSHAREDロックを作成し、最初の書き込み操作はRESERVEDロックを作成します。

すべての変更がページキャッシュに収まると、最初の実際の書き込み操作はの間に発生しCOMMITます。

の実行時にSQLiteにロックを強制するには、次のコマンドBEGINでトランザクションを開始しBEGIN IMMEDIATEます。

BEGIN IMMEDIATEの後、他のデータベース接続はデータベースに書き込むことも、BEGINIMMEDIATEまたはBEGINEXCLUSIVEを実行することもできなくなります。ただし、他のプロセスはデータベースからの読み取りを続行できます。

読み取りを防止したい場合(どのような場合でもすべてのトランザクションが適切にシリアル化されるため、これは必要ありません)、を使用しますBEGIN EXCLUSIVE

于 2013-03-26T20:26:09.053 に答える