NodeJS实现MySQL事务处理

1、构建事务处理函数

execTrans(sqlparamsEntities, callback) {
    connection.beginTransaction(function (err) {
        if (err) {
            return callback(err, null);
        }
        console.log("开始执行transaction,共执行" + sqlparamsEntities.length + "条数据");
        var funcAry = [];
        sqlparamsEntities.forEach(function (sql_param) {
            var temp = function (cb) {
                var sql = sql_param.sql;
                var param = sql_param.value;
                connection.query(sql, param, function (tErr, rows, fields) {
                    if (tErr) {
                        connection.rollback(function () {
                            console.log("事务失败," + sql_param + ",ERROR:" + tErr);
                            throw tErr;
                        });
                    } else {
                        return cb(null, rows);
                    }
                })
            };
            funcAry.push(temp);
        });

        async.series(funcAry, function (err, result) {
            console.log("transaction error: " + err);
            if (err) {
                connection.rollback(function (err) {
                    console.log("transaction error: " + err);
                    // connection.release();
                    return callback(err, null);
                });
            } else {
                connection.commit(function (err, info) {
                    console.log("transaction info: " + JSON.stringify(info));
                    if (err) {
                        console.log("执行事务失败," + err);
                        connection.rollback(function (err) {
                            console.log("transaction error: " + err);
                            // connection.release();
                            return callback(err, null);
                        });
                    } else {
                        // connection.release();
                        return callback(null, result);
                    }
                })
            }
        })
    });
}

2、封装一层函数,传入多个SQL语句

这部分与之前的博客共用了部分代码。此处是博客入口

this.ControlAPI_objs_trans_async = function(...vars) {
	let len = vars.length-1;
	let callback = vars[vars.length-1];
	let sqlObjList = [];
	for(let i = 0; i < len; i++){
		if (vars[i].sql) {
			sqlObjList.push(vars[i]);
		} else {
			let sqlObj = this._structureAnalysis(vars[i]);
			sqlObjList.push(sqlObj);
		}
	}
	database.execTrans(sqlObjList, callback);
}

3、调用示例

这部分与之前的博客共用了部分代码。此处是博客入口

let stru1 = dbController.getSQLObject();
stru1["query"] = "select";
stru1["tables"] = "seqRecord";
stru1["data"] = {
    "day": 0,
    "seq": 0
};
stru1["where"]["condition"] = [
    "day = " + dbController.typeTransform(today)
];

let stru2 = dbController.getSQLObject_sv();
stru2["sql"] = `update seqRecord set seq = seq + 1 where day = '${today}';`;

dbController.ControlAPI_objs_trans_async(stru1, stru2, (error, result) => {
    if (error) {
        utils.sendResponse(res, 404, {"errorCode": CONFIG.ErrorCode.GET_SEQ_FAIL, "msg": "获取失败"});
        return;
    } else {
        utils.sendResponse(res, 200, {"errorCode": 0, "msg": "", "data": result[0][0]});
    }
})
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZTao-z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值