2009-05-28 10 views
3

私はプロトタイプのアプリケーションを書いています。今では、一意でない列を挿入するなど、いくつかの処理が失敗します。この場合、私はすべてのことをロールバックしたいと思います。それ、どうやったら出来るの? 私はsqliteにも気付いています。データをコミットする必要があります.C#では自動ロールバックオプションがあると思われます。トランザクションsqlite? C#で

答えて

12

ロールバックは:あなたが探していること

トランザクションは、コマンドテキスト「INSERT OR ROLLBACKが...」であるように見えます。 EDIT:ええ、SQLLiteは本当に「トランザクション」クエリを使用代わりにして、あなたを強制的に

using (DbTransaction dbTrans = myDBConnection.BeginTransaction()) 
{ 
    using (DbCommand cmd = myDBConnection.CreateCommand()) 
    { 
     ... 
    } 
    dbTrans.Commit(); 
} 
4

SQLite.orgは言う:

SQLiteバージョン3も にロックと同時実行制御 への変更は、トランザクションがSQL 言語レベルで動作し 方法で、いくつかの微妙な変化を紹介します。デフォルトでは、SQLite バージョン3は自動コミットモードで動作します。 自動コミットモードでは、 データベース接続に関連するすべての操作が完了するとすぐに、 データベースに対するすべての変更がコミットされます。

SQLコマンドが (TRANSACTIONキーワードはオプションです) 自動コミット・モードからのSQLiteを取るために使用されている "TRANSACTIONはBEGIN"。 BEGIN コマンドは、データベース のロックを取得しないことに注意してください。 BEGINコマンドの後、 SHAREDロックは、 の最初のSELECTステートメントが実行されたときに取得されます。 A 最初のINSERT、UPDATE、またはDELETEの ステートメントが実行されると、RESERVEDロックが取得されます。いいえ排他的な ロックは、 メモリキャッシュがいっぱいになるまで、または がディスクに書き込まれるまで、または トランザクションがコミットするまで取得されません。このようにして、 システムは、最後に可能な限り の瞬間まで、ファイルアクセスを ファイルにブロックします。 sqliteの自動的に開始するときは、特に述べる場合を除き、独自のトランザクションに各コマンドを置く:

+0

:TMLは、明示的にトランザクションをコミットする/開くの

例がある彼の答えで詳しくもう少しこの部分を説明しますそれらを一つずつ送る悪い習慣。 – djangofan

関連する問題