【问题标题】:TransactionInactiveError in IndexedDBIndexedDB 中的 TransactionInactiveError
【发布时间】:2014-03-24 19:37:42
【问题描述】:

我们可以在 IndexedDB 的另一个事务中创建一个事务吗?我想将我的 indexedDB 数据导出到我的 Sql Server。为此,我正在使用游标进行迭代,并在成功插入后将数据发送到我的 Sql Server,我想删除 IDB 中的相同数据。在执行此操作时,我收到 TransactionInactive Error: Your transaction is not active. 给我一些解决这个问题的建议..

            var trans = db.transaction(["Applicant"],"readwrite");
            var store = trans.objectStore("Applicant");
            //console.log(store);

            var index = store.index("AM_Applicant_Name");
            var key = IDBKeyRange.lowerBound(0);
            var cursor = index.openCursor(key);
            //console.log(cursor);

            cursor.onsuccess = function(e) {
                var result = e.target.result;
                console.log(result);

                if(result) {
                    alert(result.value["AM_Applicant_Name"]+" "+result.value["AM_Father_Name"] +" "+result.value["id"]);

                    // Code To Save IDB values to Sql Server
                    if (window.XMLHttpRequest) {
                        var sPath = "IndexedDB.aspx?Insert=Y";
                        console.log(sPath);
                        var xhr = new XMLHttpRequest();
                        xhr.open("POST", sPath, true);
                        xhr.onreadystatechange = function() {
                            if (xhr.readyState == 4 && xhr.status == 200) {
                                if (xhr.responseText != "") {

                                }
                                alert(xhr.getResponseHeader("Y-Result")+" and "+xhr.getResponseHeader("Y-Id"));
                                if (xhr.getResponseHeader("Y-Result") == "Y") {  //Check Data Insertion is Success or Not
                                    alert("Moved Successfully.");
                                }
                                if (xhr.getResponseHeader("Y-Id") != "") {  //Check Data Insertion is Success
                                    alert(xhr.getResponseHeader("Y-Id")+"ds");
                                    //Delete From IDB 

                                    store.delete(xhr.getResponseHeader("Y-Id")); **Here I am getting the error**
                                    console.log("Record Deleted From IndexedDB");
                                }
                            }
                        }


                        //Passing Parameters to Server Side Events
                        xhr.setRequestHeader("District_Code", result.value["AM_District_Code"]);
                        xhr.setRequestHeader("Taluk_Code", result.value["AM_Taluk_Code"]);
                        xhr.setRequestHeader("Hobli_Code", result.value["AM_Hobli_Code"]);
                        xhr.setRequestHeader("Village_Code", result.value["AM_Village_Code"]);
                        xhr.setRequestHeader("Habitation_Code", result.value["AM_Habitation_Code"]);
                        xhr.setRequestHeader("Reservation_Code", result.value["AM_Reservation_Code"]);
                        xhr.setRequestHeader("Caste_Code", result.value["AM_Caste_Code"]);
                        xhr.setRequestHeader("Applicant_Name", result.value["AM_Applicant_Name"]);
                        xhr.setRequestHeader("Father_Name", result.value["AM_Father_Name"]);
                        xhr.setRequestHeader("Mobile_No", result.value["AM_Mobile_No"]);
                        xhr.setRequestHeader("Address", result.value["AM_Address"]);
                        xhr.setRequestHeader("Address1", result.value["AM_Address1"]);
                        xhr.setRequestHeader("Address2", result.value["AM_Address2"]);
                        xhr.setRequestHeader("Pin_Code", result.value["AM_Pin_Code"]);
                        xhr.setRequestHeader("Id", result.value["id"]);

                        xhr.send();
                    }

                    result.continue();
                }
            }

【问题讨论】:

    标签: indexeddb


    【解决方案1】:

    感谢您的提问。

    您收到 TransactionInactiveError 是因为您要执行的删除操作发生在 ajax 调用的回调中。

    indexeddb 是自动提交的,这意味着一旦对事务的操作完成,事务就会提交。在您的情况下,这意味着一旦迭代游标中的所有结果,事务将被提交。由于异步回调,事务不会等待可能进行的额外调用。

    所以您应该立即删除该项目或为每次删除打开一个新事务。

    【讨论】:

    • 在大多数数据库中,您必须手动提交。我认为问题不是自动提交,而是事务生命周期短。
    • 我认为这只是缺乏对异步调用的接触。
    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多