2017-10-11 156 views
1

假設這個簡單的查詢。如果數據庫連接關閉或數據庫服務器關閉,會立即執行查詢會發生什麼

var knex = require("knex")(knexConfig); 
    var insert1 = {col1: "a4", col2: "b4", col3: "c4"}; 

    knex.insert(insert1).into("test").then(function (id) { 
     console.log(id); 
    }) 
    .finally(function() { 
     knex.destroy(); 
    }); 

如果在執行插入查詢後數據庫服務器關閉或連接立即關閉,會發生什麼情況?它存儲數據並返回錯誤,或者它不存儲數據並返回錯誤?

+1

它可能會插入或它可能不會。它可能發送一個錯誤,或者它可能不會。 –

+0

感謝您的回覆。在那種情況下,後端應該如何處理這種情況? – UserBH

+0

@UserBH不清楚這意味着什麼。如果後端是數據庫,它已經啓動了該案例,它不必「處理」它。如果它是應用程序,它不能處理它,如果它沒有收到錯誤。 – EJP

回答

0

如果插入查詢已執行,但結果尚未發送到客戶端,數據將存儲在數據庫中,但knex將引發錯誤,該連接丟失。

如果這將在交易中完成,在這種情況下,數據不會被存儲,並且knex會拋出相同類型的錯誤。

在這種情況下,您應該在事務中進行插入操作,以便您知道如果出現了一些錯誤,數據不在DB內部但是仍然有可能在向DB添加行後例如express無法將結果返回給REST調用,並且由於存在錯誤,您的前端無法確定是否插入了數據。

因此,處理這種情況的最佳方式是相信數據在那裏,如果一切都成功了,並且如果出現錯誤,用戶應該檢查數據是否被添加(如果這是真實的不關鍵只是假設沒有添加數據並再次嘗試,如果重要的是相同的數據不會發布兩次,請確保數據庫模式有一些約束來阻止它)。

+0

在現實生活中,您應該使交易冪等。不需要檢查。 – EJP

+0

我明白了。謝謝您的幫助。 – UserBH

+0

@EJP我的答案的最後部分實際上也是這樣說的,但用更多的話 –

相關問題