Safari Client-Side Storage and Offline Applications Programming Guideに記載されているように、HTML 5 Web SQL データベース トランザクションのロールバックは、トランザクション メソッドへのエラー コールバックとして提供されるコールバック関数で true を返すことによって行われますexecuteSql
。
クエリごとのエラー処理コールバックはかなり単純です。コールバックが true を返す場合、トランザクション全体がロールバックされます。コールバックが false を返した場合、トランザクションは何も問題がなかったかのように続行されます。したがって、オプションのクエリを実行している場合 (その特定のクエリの失敗によってトランザクションが失敗するべきでない場合)、false を返すコールバックを渡す必要があります。クエリの失敗によってトランザクション全体が失敗する場合は、true を返すコールバックを渡す必要があります。
たとえば、次のトランザクションがある場合 (「users」テーブルの「username」フィールドに UNIQUE 制約があり、ユーザー名「test」が既に存在するとします。これを再度挿入しようとすると、制約エラーが発生するはずです) :
database.transaction(function(transaction) {
transaction.executeSql(
"INSERT INTO users (username) VALUES('test')",
null,
dataCallback,
errorCallback
);
});
function errorCallback() {
return true; //this causes the rollback
}
2 つの質問があります。
トランザクション内に多くの操作を含める必要があり (たとえば、ajax を使用してサーバーにデータを送信し、応答を待つ必要があるなど)、応答が到着する前にユーザーがページをリロードした場合 (つまり、errorCallback呼び出されません)、トランザクションはコミットされますか、それとも失敗しますか?
Web SQL トランザクションを手動でロールバックする方法を知っている人はいますか? たとえば、ajax 呼び出しの結果に基づいてトランザクションをロールバックしたい場合、どのように行うことができますか? エラー コールバックが確実に呼び出されるようにするには、エラーを含むクエリを実行する必要がありますか?
ありがとう。