繁体   English   中英

如何处理交易错误?

[英]How do I handle transaction errors?

假设我在HTTP请求处理程序中有以下代码:

// these come from the HTTP request payload.
var channel = {};
var screencast ={};

try {
  connection.beginTransaction(function(err) {
    if (err) { 
      throw err; 
    }
    connection.query('INSERT INTO Channels SET ?', channel, function (err, result) {
      if (err) { 
        connection.rollback(function() {
          throw err;
        });
      }
      connection.query('INSERT INTO Screencasts SET ?', screencast, function (err, result) {
        if (err) { 
          connection.rollback(function() {
            throw err;
          });
        }
        connection.commit(function(err) {
          if (err) { 
            connection.rollback(function() {
              throw err;
            });
          }
          console.log('success!');
        });
      });
    });
  });
} catch (err) {
  // render error page or something like that.
  console.log(err)
}

当发生错误时,我希望catch块被调用-事实并非如此。 为什么不?

我没有看到扔这么多错误的点,如果我不能catch他们。 有人可以解释一下吗?

另外,如果我不能依赖于catch块,我怎样检测发生了错误,然后做一些事情

(由于改编了一个示例,所以我对此代码知之甚少。)

花了一些时间学习诺言

var mysql   = require('mysql');
var Promise = require('bluebird');
Promise.promisifyAll(require('mysql/lib/Connection').prototype);

connection.beginTransactionAsync().then(function() {
  return connection.queryAsync('INSERT INTO Channels SET ?', channel);
}).then(function() {
  return connection.queryAsync('INSERT INTO Screencasts1 SET ?', screencast);
}).then(function() {
  return connection.commit();
}).error(function(e) {
  connection.rollback();
});

当您处理错误优先的异步回调时,不会引发错误。 而是将错误作为回调函数的第一个参数传递。 因此,在那里处理错误。 (在嵌套回调的情况下,这可能意味着只需调用带有错误的父回调即可。)

基本上:您不能在这些回调中引发错误,除非它们在引发该错误的同一个回调中被捕获。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM