事务未回滚,就启动下一个事务
发布于 10 年前 作者 HunterGitHub 3455 次浏览 最后一次编辑是 8 年前 来自 问答

第一个事务部分失败了,还没来及回滚,下一个事务就启动了,这样会把前一个事务提交(在一个连接里面),这是什么情况,怎么解决呢? 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);
	});
}
回到顶部