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