CNode

事务未回滚,就启动下一个事务

问答
HHunterGitHub发布于11 年前最后回复11 年前2 回复3932 浏览0 收藏

第一个事务部分失败了,还没来及回滚,下一个事务就启动了,这样会把前一个事务提交(在一个连接里面),这是什么情况,怎么解决呢? start transaction; update 1...... update 2...... 失败了,rollback之前启动另一个事务 start transaction; update

这样之前的事务就提交了,数据就不一致了,这个怎么解决

查看回复

回复 (2)

A
alsotang#1·11 年前

在一个事务中启动另一个事务,sql 真的推荐这么做吗 - -

T
tulayang#2·11 年前
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);
	});
}
参与回复
登录后即可参与回复。登录