この例を確認してください:
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 がロールバック メカニズムをトリガーしないのはなぜですか?