gpt4 book ai didi

MySQL 事务不停止 for 循环中的竞争条件

转载 作者:搜寻专家 更新时间:2023-11-01 00:08:37 29 4
gpt4 key购买 nike

我正在使用 node-mysql在我的申请中。我尝试实现 SELECT FOR UPDATE但我没能让它正常工作。我遇到的问题类似于下面的代码。下面 for 循环中的第一个事务没有成功阻止第二个事务。相反,两个事务同时 SELECT FOR UPDATE 并获得相同的记录。我怎样才能解决这个问题?谢谢!

var testTransaction = function (count) {
connection.beginTransaction(function(err) {
if (err) throw err;
db.query('SELECT * FROM myTable WHERE id = 1 FOR UPDATE', function(err, rows, result) {
if (err) {
connection.rollback(function() {
throw err;
});
}
connection.query('UPDATE myTable SET myField=? WHERE id=1', (count + 1), function(err, result) {
if (err) {
db.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
db.rollback(function() {
throw err;
});
}
console.log('success!');
});
});

});

});
}

for (var i = 0; i < 2; i++) {
testTransaction(i);
}

最佳答案

node-mysql 中的方法模块被编写成异步的,因此不会阻塞应用程序。如果你没有理由使用循环,那么你可以只向你的函数添加一个回调并嵌套执行:

var testTransaction = function(count, callback) {
connection.beginTransaction(function (err) {
if (err) throw err;
db.query('SELECT * FROM myTable WHERE id = 1 FOR UPDATE', function (err, rows, result) {
if (err) {
connection.rollback(function() {
return callback(err);
});
}
connection.query('UPDATE myTable SET myField=? WHERE id=1', (count + 1), function (err, result) {
if (err) {
db.rollback(function() {
return callback(err);
});
}
connection.commit(function (err) {
if (err) {
db.rollback(function() {
return callback(err);
});
}
callback(null);
console.log('success!');
});
});
});
});
};

testTransaction(0, function(err) {
testTransaction(1, function(err) {
// both operations have completed
});
});

如果出于某种原因需要循环异步函数,那么我会看一下 async图书馆。

关于MySQL 事务不停止 for 循环中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283825/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com