2012-12-23 82 views
2

我正在爲我的Phonegap應用程序開發一些數據庫操作。我正在測試SQLite的事務功能,有一點,我不明白。JavaScript SQLite事務回滾

這裏在一個事務中的例子:

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); 
     }); 
}); 

中間的SQL查詢拋出一個錯誤(無法準備的語句(1個表foo已存在)),因爲表「foo」存在。問題是,爲什麼交易沒有回滾?我能以某種方式強制事務回滾出錯嗎?

我的聲明中有錯誤嗎?

回答

4

要回滾整個事務,你的錯誤處理回調函數應該返回true,描述here

每查詢錯誤回調

的每個查詢的錯誤處理回調 相當簡單。如果回調返回true,整個交易將被回滾。如果回調返回false,則交易繼續,如同沒有任何錯誤。

因此,如果您正在執行的查詢是可選的 - 如果 失敗,讓特定的查詢不應該導致交易失敗,您應該 在返回false回調傳遞。如果 查詢失敗應導致整個事務失敗,則應通過 返回true的回調。

眼下錯誤處理程序返回undefined(因爲沒有明確的return說法是存在的),所以只有受影響的動作被跳過。

+0

非常感謝!有用 :-) –