最近在写一个网站需要用到事务,node-mysql 是支持事务的,也没有问题,如下:
// 从链接池里得到connection
pool.getConnection(function(err, connection) {
if(err) {
console.error('mysql 链接失败');
return callback(err, null);
}
// 开始事务
connection.beginTransaction(function(err) {
if(err) {
throw err;
}
async.parallel([
function(callback) {
connection.query("执行sql,比如是添加任务", callback);
},
function(callback) {
connection.query("执行sql,添加任务时间区段", callback);
}
], function(err, result) {
if(err) {
connection.rollback(function() {
throw err;
});
return ;
}
// 提交事务
connection.commit(function(err) {
if (err) {
connection.rollback(function() {
throw err;
});
}
console.log('success!');
});
});
});
});
我们知道,使用的事务的时候必须所有的操作都在一个connection 上, 在这段代码里插入了一条任务,和任务的时间区段 但是生产的代码不可能是这个样子,对任务和时间区段的操作都会有个子的service,
mysqlUtil.beginTransaction(function(err) {
if(err) {
throw err;
}
async.parallel([
function(callback) {
taskService.add(task, callback);
},
function(callback) {
segment.add(segment, callback);
}
], function(err, result) {
if(err) {
mysqlUtil.rollback(function() {
throw err;
});
return ;
}
mysqlUtil.commit(function(err) {
if (err) {
mysqlUtil.rollback(function() {
throw err;
});
}
console.log('success!');
});
});
});
每一个service 都会自己从pool 里自己得到connection,问题就出现了,我没有办法保证让启动是的connection 和service 使用的connection是一个,各位大牛有什么好的办法吗?
8 回复
@xbl1949 你直接用 node-mysql 更加复杂把,代码耦合很严重,业务逻辑代码和事务代码夹在一起,让你无所是从,可以看看 bearcat-todo, 一个简单的todo的例子,用了bearcat-dao