【问题标题】:How to do data integrity and error handling?如何做数据完整性和错误处理?
【发布时间】:2017-03-27 02:24:46
【问题描述】:

也许这是一个愚蠢的问题,但是我问了一些朋友并谷歌了一段时间后,仍然找不到很好的解释。

例如,当一个用户发帖时,我会做以下操作:

  1. MySQL.insert(用户、postTitle、postBody、时间)
  2. Redis.incr user.totalPostCount
  3. Redis.set last10Posts

所以我的问题是,例如,如果1 成功但2 失败,我该怎么办?

忽略redis错误继续?那么user.totalPostCount 不正确。

重试redis.incr?重试失败怎么办?

将错误返回给最终用户说post fail 并让用户再次发布?

删除之前插入的帖子并向用户返回错误?

mysql.insert({user: user, postTitle: postTitle, postBody: postBody}, function(err, mysqlId) {
  if(err) { return Error(500); }
  redis.incr({user: user, totalPostCount}, function(err, result) {
    if(err) { mysql.delete(mysqlId)}
    setLast10Post({newPost: {postTitle...}}, function(err, result) {
      if(err) {mysql.delete(mysqlId); redis.decr({user.totalPostcount})}
    })
  })

})

【问题讨论】:

  • 为什么要关闭?我认为这很常见

标签: javascript php mysql node.js web-services


【解决方案1】:

您可能希望这 3 个操作成为单个原子操作。也就是说,如果任何步骤失败,您要确保整个事情都失败并且没有任何反应。

所以对于场景 1(1 成功,2 失败),您将回滚 SQL 查询并报告错误。您可以忘记发生的任何事情或在那时重试整个过程。

至于实际创建这个事务,也许这个link 是有帮助的。

【讨论】:

  • 如何使其成为单个原子操作?我可以将这三个步骤进行交易吗?
  • 在没有看到您的代码的情况下很难制定具体的解决方案。也许您有用户操作的回调,所有这些操作都封装在该回调中。当其中一个失败时,在您的错误处理程序中,您回滚已经发生的任何其他事情,然后取消操作。那有意义吗?我想严格来说,如果在这一切中间发生了一些灾难性的事情,那将不是一笔交易。不过,您绝对可以从中进行实际交易。
  • 我已经添加了一些代码,所以我必须检查每个错误并回滚以前的操作?那么如果回滚操作失败会发生什么?
猜你喜欢
  • 2010-11-02
  • 2011-06-13
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
相关资源
最近更新 更多