gpt4 book ai didi

javascript - WebSQL 不回滚

转载 作者:行者123 更新时间:2023-11-29 22:14:08 27 4
gpt4 key购买 nike

检查这个例子:

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/

触发唯一约束的insert查询,不停止让websql继续执行下一个查询。所以在过程结束时你将有 4 行,这是没有意义的,因为如果我在事务下,当触发约束错误时,所有先前对表的更改都将被丢弃。

为什么Websql不触发回滚机制?

最佳答案

WebSQL 事务中的错误处理程序需要为要中止的事务返回一个非假值。在这种情况下,错误处理程序仅调用 console.log,这实际上允许事务继续进行。

如果将其作为错误处理程序:

var error = function(tx,results) {
console.log( results );
return true; // added a non-false return value
};

然后,当违反唯一性约束时,事务应该按预期中止。

(我相信你现在已经想通了,但我遇到了同样的问题,看到了这个问题,没有得到答案,不得不自己想办法。)

编辑:因为我没有评论权限,这在 http://www.w3.org/TR/webdatabase/#processing-model 中有概述。 ,第 6 步。到目前为止,我不需要手动回滚任何查询或更改我的查询语句来正确中止事务。可能存在实现差异,因为我一直在桌面 Safari 上使用 Web SQL。

关于javascript - WebSQL 不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16225320/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com