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:"成功"}');//响应
}
}
};