2

Phonegapアプリ用にいくつかのDBアクションを開発しています。私はSQLiteのトランザクション機能をテストしていますが、理解できない点が1つあります。

1つのトランザクションの例を次に示します。

dbObj.dbConnection.transaction(function (tx) {
    tx.executeSql('INSERT OR IGNORE INTO foo (id, text) VALUES (?, ?)', [6,"aaalabala6"], function(tx, results) {
         document.write("make insert<br>");
      }, function (tx, err){
        alert(err.message);
      });

    tx.executeSql('CREATE TABLE foo (id unique, text)', [], function(tx, results) {

    }, function (tx, err){
        console.log(err.message); // here an error - table already exists
    });

    tx.executeSql('INSERT OR IGNORE INTO foo (id, text) VALUES (?, ?)', [7,"aaalabala7"], function(tx, results) {
         document.write("make insert<br>");
      }, function (tx, err){
        alert(err.message);
      });
});

テーブル"foo"がすでに存在するため、中央のSQLクエリがエラーをスローしています(ステートメントを準備できませんでした(1つのテーブルfooがすでに存在します))。問題は、なぜトランザクションがロールバックを行わないのかということです。エラー時にトランザクションのロールバックを強制することはできますか?

ステートメントにエラーがありますか?

4

1 に答える 1

4

トランザクション全体をロールバックするには、ここでtrue説明するように、エラー処理コールバック関数がを返す必要があります。

クエリごとのエラーコールバック

クエリごとのエラー処理コールバックはかなり単純です。コールバックがtrueを返す場合、トランザクション全体がロールバックされます。コールバックがfalseを返した場合、トランザクションは何も問題がなかったかのように続行されます。

したがって、オプションのクエリを実行している場合(その特定のクエリが失敗してもトランザクションが失敗しない場合)は、falseを返すコールバックを渡す必要があります。クエリが失敗するとトランザクション全体が失敗する場合は、trueを返すコールバックを渡す必要があります。

現在、エラーハンドラーが返さundefinedれるため(明示的なreturnステートメントがないため)、影響を受けるアクションのみがスキップされます。

于 2012-12-23T16:02:55.100 に答える