Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果节点js中存在mysql和restfull API事务,如何使用回滚_Mysql_Node.js_Rollback - Fatal编程技术网

如果节点js中存在mysql和restfull API事务,如何使用回滚

如果节点js中存在mysql和restfull API事务,如何使用回滚,mysql,node.js,rollback,Mysql,Node.js,Rollback,我在node js中有一些事务,第一个是从mysql表(表:customers)中选择数据,第二个是将数据插入mysql表(表:customers),第三个是使用restfull API发送数据并保存,最后一个是将数据插入mysql表(表:generate_spks),我想在我的node js中应用回滚 我尝试过这样做,但如果最后一个事务失败(插入generate_spks表),我使用restfull API发送和保存的数据将保持(仍在运行),即使由于最后一个事务失败而不应发送 我试过这样的链接

我在node js中有一些事务,第一个是从mysql表(表:customers)中选择数据,第二个是将数据插入mysql表(表:customers),第三个是使用restfull API发送数据并保存,最后一个是将数据插入mysql表(表:generate_spks),我想在我的node js中应用回滚

我尝试过这样做,但如果最后一个事务失败(插入generate_spks表),我使用restfull API发送和保存的数据将保持(仍在运行),即使由于最后一个事务失败而不应发送

我试过这样的链接

这是我的
db.js

var mysql = require("mysql");

function Connection() {

    this.pool = null;

    var konek = {
        host: '19*.16*.**.***',
        user: 'my_user',
        password: 'my_password',
        database: 'my_database'
    };

    this.init = function() {
        this.pool = mysql.createPool(konek);
    }

    this.acquire = function(callback) {
        this.init();
        this.pool.getConnection(function(err, connection) {
            callback(err, connection);
        });
    };
}
module.exports = new Connection();
这是我的
控制器

var connection = require('../../config/db');

function Todo() {

this.insertSpkBranchNo = function(req, res, next) {
    var id = uuidv1();
    var cust_code = 'C-0001'
    var cust_nama = req.body.cust_nama;
    var cust_noktp = req.body.cust_noktp;
    var cust_kk = req.body.cust_kk;
    var created = new Date();
    var modified = new Date();

    connection.acquire(function(err, con) {
      con.beginTransaction(function(){
        con.query('SELECT cust_code FROM customers ORDER BY cust_code desc LIMIT 1', function(err, result){
           if (err) {
              con.rollback(function(){
              console.log(err);
              res.send({ status: 400, message: 'Select Customer Code Failed' });
              });
           } 

           con.query('INSERT INTO customers (id,cust_code,cust_nama,cust_noktp,cust_kk,created,modified) VALUES (?,?,?,?,?,?,?)', [id,cust_code,cust_nama,cust_noktp,cust_kitas,created,modified], function(err, result) {
               if (err) {
                  con.rollback(function(){
                  console.log(err);
                  return res.send({ status: 400, message: 'Insert Customer Failed' });
                  });
               } 

               var url = 'http://45.**.***.***/api-dev/api_insert_customer.php';

               var requestData = {
                   id:id,
                   cust_code:cust_code,
                   cust_nama:cust_nama,
                   cust_noktp:cust_noktp,
                   created:created, 
                   modified:modified,
                   cust_kk:cust_kk,
                }

                var data = {
                   url: url,
                   auth: {
                   bearer: '71D55F99*****'
                   },
                json: true,
                form: requestData,
                rejectUnauthorized: false, //add when working with https sites
                requestCert: false, //add when working with https sites
                agent: false, //add when working with https sites
               }

               request.post(data, function(err, httpResponse, body) {
                  if (body.status == "0") {
                     con.rollback(function(){
                     console.log(err);
                     return res.send({ status: 400, message: 'Send customer to dms Failed' });
                     });
                   }  

                   var id = uuidv1();
                   var id_customer = req.body.id_customer;
                   var cust_nama = req.body.cust_nama;
                   var cust_alamat = req.body.cust_alamat;
                   var cust_hp = req.body.cust_hp;
                   var cust_telp = req.body.cust_telp;
                   var cust_npwp = req.body.cust_npwp;

                   con.query('INSERT INTO generate_spks (id, id_customer, cust_nama, cust_alamat, cust_hp, cust_telp, cust_npwp) VALUES (?,?,?,?,?,?,?)', [id, id_customer, cust_nama, cust_alamat, cust_hp, cust_telp, cust_npwp], function(err, result) {
                      if (err) {
                         con.rollback(function(){
                         console.log(err);
                         return res.json({ status: 400, message: 'Insert spk failed' });
                         });
                       }

                       con.commit(function(err) {
                          if (err) { 
                            con.rollback(function() {
                            console.log(err);
                            return res.json({ status: 400, message: 'Commit failed' });
                            });
                           } else {
                             return res.json({ status: 200, message: 'success' });
                           }
                      });

                   });

                 });

              });

            });   

          });

          console.log('Transaction Complete.');
          con.end();
        });
    };
}

module.exports = new Todo();
我希望如果最后一个事务(插入generate_spks表)失败,第三个事务(使用restfull API)将不会保存


我的代码错了吗?任何帮助都将不胜感激。谢谢..

因为第三个事务是在API中实现的,所以它不是当前事务的一部分,因此,您必须通过实现一个查询来手动删除它,以还原在第三个事务中所做的更改。@DarkShadow所以我不能对我的事务应用回滚?是的,因为根据我的猜测,API中的特定查询正在不同的连接上运行。为什么要分别在API中实现该操作,它是否托管在不同的服务器上?@DarkShadow是的,它位于不同的服务器上server@DarkShadow没有其他方法用这个API实现回滚吗?