2017-10-11 164 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我的答案的最后部分实际上也是这样说的,但用更多的话 –

相关问题