Nodejs连接服务器连接mysql数据库(带事务功能)

mySqlJustQuery.js

/**
 * 获取连接,该连接提供事务功能的数据库功能
 * funcName : 回调参数名,提供回调入口
 */
exports.getClient =function (funcName){
    query.pool.acquire(function(err,client){
        client.query("BEGIN;",function(err,rows,fields){
            funcName(err,client);//事务功能开始。执行回调函数
        })
    })
}


/**
 * 如果发生错误,回滚所有事物
 * client :要关闭的连接
 * funcName :下一个要执行的名字(一般直接响应给客户端,请求执行失败)
 */
exports.rollBack = function(client,res,data){
    client.query("rollBack;",function(err,rows,fields){
        query.pool.release(client);//关闭资源
        //funcName(err,res)
        if(data.render){
            var renderStr = data.render;
            delete data["render"];//返回响应页面
            res.render(renderStr,data)
        }else {
            res.send(data);//响应请求处理值
        }
    })
}



/**
 * 提交事务:异步提交事务并关闭连接
 * client :连接
 * funcName :下一个要执行的名字(一般直接响应给客户端,返回执行结果)
 */
exports.endT = function(client,res,data){
    client.query("COMMIT;",function(err,rows,fields){
        //if(err)mySql.rollBack(client,funcName,res,"数据库执行错误");
        query.pool.release(client);//关闭资源
        //funcName(err,res)
        if(data.render){
            var renderStr = data.render;
            delete data["render"];
            res.render(renderStr,data);
        }else {
            res.send(data);//响应
        }


    })
}


/**
 * 执行sql语句
 * sql :要执行的sql语句
 * client :连接
 * funcName :下一个要执行的名字
 */
exports.querySql = function(sql,client,funcName){
    client.query(sql,function(err,rows,fields){
        var result = {};
            result.status = "成功";
        if (err){
            result.status = "失败";
            result.err = err;
        }else{
            if(rows.insertId > -1){
                result.affectedRows = rows.affectedRows;//受影响的行
                result.changedRows = rows.changedRows;//值发生改变的行
                if(rows.insertId > 0)result.insertId = rows.insertId;//insert的时候返回添加时的id
            }else{
                result.data = rows;//如果是select时返回列表
            }
        }
        funcName(err,client,result);//result数据格式为{status:"成功or失败",data:"Array Or JSON"}
    })
}

使用流程
test.js


//事务开始


var mysqlT= require("../public/mySqlJustQuery.js");

module.exports.run = function(conn,body){

    mysqlT.getClient(doSql);//获取连接

    function doSql(err,client){
        mysqlT.querySql("update user set username = 'test'",client,checkUser);
    }

    function checkUser(err,client,result){
        if(err || result.status != "成功" || !result.data.length){
            mysqlT.rollBack(client,res,'{status:"失败"}');//如果执行失败回滚
        }else{
            mysqlT.endT(client,res,'{status:"成功"}');//响应
        }
        mysqlT.querySql("update user set passWord= 'test'",client,response);
    }

    function response(err,client,result){
        if(err || result.status != "成功" || !result.data.length){
            mysqlT.rollBack(client,res,'{status:"失败"}');//如果执行失败回滚
        }else{
            mysqlT.endT(client,res,'{status:"成功"}');//响应
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值