【问题标题】:What happens if database connection is closed or database server is down immediately executing a query如果数据库连接关闭或数据库服务器立即关闭执行查询会发生什么
【发布时间】:2018-03-23 13:56:51
【问题描述】:

假设这个简单的查询。

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

如果数据库服务器在执行插入查询后立即关闭或连接关闭会发生什么?是存储数据返回错误还是不存储数据返回错误?

【问题讨论】:

  • 可以插入也可以不插入。它可能会发送错误,也可能不会。
  • 感谢您的回复。那么,后端应该如何处理这种情况呢?
  • @UserBH 不清楚这意味着什么。如果后端是数据库,它已经启动了案例,它不必“处理”它。如果是应用程序,如果没有收到错误则无法处理。

标签: mysql node.js knex.js


【解决方案1】:

如果插入查询已执行,但结果尚未发送到客户端,数据将存储在 DB 中,但knex 将抛出错误,即连接丢失。

如果这会在事务中完成,那么在这种情况下数据将不会被存储,knex 会抛出同样类型的错误。

在这种情况下,您可能应该在事务中进行插入,这样您就会知道如果出现错误,数据不在数据库中......但是在将行添加到数据库后仍然有可能,例如 express 失败将结果返回给 REST 调用,您的前端再次无法确定是否插入了数据,因为发生了错误。

因此,处理这种情况的最佳方法是只相信数据是否存在,如果一切都成功并且如果出现错误,用户应该检查是否添加了数据(在现实生活中,如果没有关键只是假设没有添加数据并重试,如果关键是相同的数据没有发布两次,请确保数据库架构有一些限制阻止它)。

【讨论】:

  • 在现实生活中,您应该使事务具有幂等性。无需检查。
  • @EJP 我的回答的最后一部分实际上也这么说,但有更多的话
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
相关资源
最近更新 更多