3

この例を確認してください:

var db = openDatabase( 'test.db', 1, '', 2*1024*1024 );

db.transaction(function(tx) { 
    var success = function(tx,results) {
        console.log( results );
    };
    var error = function(tx,results) {
        console.log( results );
    };
    // clean previous state
    tx.executeSql( 'DROP TABLE IF EXISTS products', [], success, error );
    tx.executeSql( 'CREATE TABLE products ( id INTEGER NULL PRIMARY KEY, name TEXT )', [], success, error );
    tx.executeSql( 'CREATE UNIQUE INDEX name ON products( name )', [], success, error );
    tx.executeSql( 'INSERT INTO products( name ) VALUES ( "Lechuga" )', [], success, error );
    tx.executeSql( 'INSERT INTO products( name ) VALUES ( "Naranja" )', [], success, error );
    tx.executeSql( 'INSERT INTO products( name ) VALUES ( "Naranja" )', [], success, error );
    tx.executeSql( 'INSERT INTO products( name ) VALUES ( "Tomate" )', [], getAll, error );
} );

function getAll(tx, results) {
    db.transaction(function(tx) {
        tx.executeSql( 'SELECT * FROM products', [], function(tx, results) {
            console.assert( results.rows.length === 0 ) // false, why?
        } );
    } );
}

jsfiddle リンク: http://jsfiddle.net/aBx7E/6/

一意の制約をトリガーする挿入クエリは、websql が次のクエリを実行し続けるために停止しないでください。したがって、プロセスの最後には 4 つの行が表示されますが、これは意味がありません。トランザクション中の場合、制約エラーがトリガーされると、テーブルに対する以前の変更がすべて破棄されるためです。

Websql がロールバック メカニズムをトリガーしないのはなぜですか?

4

2 に答える 2

0

@jylへ

を呼び出すときに、エラーが発生した場合に呼び出されるdb.transaction( function( tx ) { ... } )2 番目のパラメータ を渡すこともできerror functionます。値を返す必要はありません。トランザクションは自動的に中止されます。

私のエラーは 、関数ではなくerror functionfor eachtx.executeSqlを 渡すことでした。これは、失敗したトランザクションをリッスンする適切な場所ですie: tx.executeSql( 'INSERT INTO products( name ) VALUES ( "Naranja" )', [], success, error )db.transaction

もう1つ、最も重要なことは、トランザクションが失敗した場合、 sqlite3はINSERT、UPDATE、またはDELETE句によって行われた以前の変更をロールバックしませんOR ROLLBACK。解決策は、キーワードを追加してクエリを作成することです。INSERT OR ROLLBACK ta ta...

私は、IndexedDBとWebSQL の両方の実装で動作する ORM ライブラリを持っており、共通の API を提供しています: https://github.com/arcollector/msqta.orm

于 2014-02-25T02:25:31.297 に答える