第二次查询执行出错如何回滚|节点JS
How to rollback when error occurred in the second query execution| NodeJS
我曾经在 PHP
中使用回滚,我想在 NodeJS
中实现相同的概念。我正在调用一个将数据插入 database
的函数,成功后我从另一个 Model
调用另一个函数将数据插入另一个 table
.
我的代码
StoreReport
'use strict';
var sql = require('./db.js');
// IMPORT ANOTHER MODEL
var CashDetailModel = require('./cashDetailModel.js');
var StoreReport =function(storeReport){
this.store_id=storeReport.store_id;
this.cash_expense=storeReport.cash_expense_amount;
}
StoreReport.addNewStoreReport = function (report_details,request,result){
sql.query('INSERT INTO store_report SET ?',report_details, function(err,res){
if(err){
result(err,null);
}else{
var new_cash_detail = new CashDetailModel(report_details);
new_cash_detail.store_report_id=res.insertId;
CashDetailModel.addCashDetail(new_cash_detail,function(err,CashDetailModel){
if(err){
// I NEED TO ROLLBACK IF ERROR OCCURED IN THIS PHASE
res.send(err);
}else{
result(null,res.inserted);
}
})
}
})
}
module.exports = StoreReport;
这里解释得很好:https://know-thy-code.com/transactions-with-multiple-queries-nodejs-mysql/。
您在第一个查询之前调用 sql.beginTransaction()
并在回调中写入您的查询。然后您可以使用 sql.rollback()
回滚您的事务或使用 sql.commit()
.
提交更改
这取决于您使用的 mysql 引擎,如果您没有明确定义事务,像 innodb 这样的跨国引擎会将每个查询视为单独的事务。
因此,为了恢复更改,您有两个选择:
- 使用更新或删除查询还原更改,这是错误的方法。
- 使用 connection.beginTransaction() 明确定义事务并相应地提交或回滚。
我曾经在 PHP
中使用回滚,我想在 NodeJS
中实现相同的概念。我正在调用一个将数据插入 database
的函数,成功后我从另一个 Model
调用另一个函数将数据插入另一个 table
.
我的代码
StoreReport
'use strict';
var sql = require('./db.js');
// IMPORT ANOTHER MODEL
var CashDetailModel = require('./cashDetailModel.js');
var StoreReport =function(storeReport){
this.store_id=storeReport.store_id;
this.cash_expense=storeReport.cash_expense_amount;
}
StoreReport.addNewStoreReport = function (report_details,request,result){
sql.query('INSERT INTO store_report SET ?',report_details, function(err,res){
if(err){
result(err,null);
}else{
var new_cash_detail = new CashDetailModel(report_details);
new_cash_detail.store_report_id=res.insertId;
CashDetailModel.addCashDetail(new_cash_detail,function(err,CashDetailModel){
if(err){
// I NEED TO ROLLBACK IF ERROR OCCURED IN THIS PHASE
res.send(err);
}else{
result(null,res.inserted);
}
})
}
})
}
module.exports = StoreReport;
这里解释得很好:https://know-thy-code.com/transactions-with-multiple-queries-nodejs-mysql/。
您在第一个查询之前调用 sql.beginTransaction()
并在回调中写入您的查询。然后您可以使用 sql.rollback()
回滚您的事务或使用 sql.commit()
.
这取决于您使用的 mysql 引擎,如果您没有明确定义事务,像 innodb 这样的跨国引擎会将每个查询视为单独的事务。
因此,为了恢复更改,您有两个选择:
- 使用更新或删除查询还原更改,这是错误的方法。
- 使用 connection.beginTransaction() 明确定义事务并相应地提交或回滚。