事务未回滚,就启动下一个事务
第一个事务部分失败了,还没来及回滚,下一个事务就启动了,这样会把前一个事务提交(在一个连接里面),这是什么情况,怎么解决呢? start transaction; update 1… update 2… 失败了,rollback之前启动另一个事务 start transaction; update
这样之前的事务就提交了,数据就不一致了,这个怎么解决
2 回复
在一个事务中启动另一个事务,sql 真的推荐这么做吗 - -
var pool = require('mysql').createPool({});
var q1 = 'start transaction; update tb1 set fa = 1 where fb = 2; insert tb2 set fc = 2; commit;';
var q2 = 'start transaction; update tb3 set fm = 1 where fe = 2; commit;';
function doTransactions(callback) {
var conn;
function doQ1(then) {
conn.query(q1, function (err, replies) {
if (err) {
if (!(replies instanceof Array)) {
conn.release();
return callback(err, null, null);
}
conn.query('rollback', function (err) {
if (err) {
conn.release();
return callback(err, null, null);
}
then(false);
});
return;
}
if (replies.length < 4 || replies[1].affectedRows !== 1 || replies[2].affectedRows !== 1) {
conn.query('rollback', function (err) {
if (err) {
conn.release();
return callback(err, null, null);
}
then(false);
});
return;
}
then(true);
});
}
function doQ2(q1Affected) {
conn.query(q2, function (err, replies) {
if (err) {
if (!(replies instanceof Array)) {
conn.release();
return callback(err, q1Affected, null);
}
conn.query('rollback', function (err) {
conn.release();
if (err) {
return callback(err, q1Affected, false);
}
});
return;
}
if (replies.length < 3 || replies[1].affectedRows !== 1) {
conn.query('rollback', function (err) {
conn.release();
if (err) {
return callback(err, q1Affected, false);
}
});
return;
}
conn.release();
callback(null, q1Affected, true);
});
}
pool.getConnection(function (err, connection) {
if (err) {
return callback(err, null, null);
}
conn = connection;
doQ1(doQ2);
});
}