【发布时间】:2018-08-04 19:16:34
【问题描述】:
对于每个会话,我当前的 MySQL 隔离级别是 tx_transaction = REPEATABLE-READ。
所以当我在不同的终端运行下面的代码时,事务是串行执行的,这意味着在第一个事务提交之前,第二个事务不会启动。
START TRANSACTION;
SELECT *
FROM test
WHERE id = 4 FOR UPDATE;
UPDATE test
SET parent = 98
WHERE id = 4;
那么,如果我在 nodeJS 中实现它,以下哪项会给出与运行两个终端相同的结果?
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'me',
password : 'secret',
database : 'my_db'
});
connection.connect();
let query =
START TRANSACTION;
SELECT *
FROM test
WHERE id = 4 FOR UPDATE;
UPDATE test
SET parent = 98
WHERE id = 4;
connection.query(query, function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
connection.query(query, function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
connection.end();
或使用池
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bob',
password : 'secret',
database : 'my_db'
});
let query =
START TRANSACTION;
SELECT *
FROM test
WHERE id = 4 FOR UPDATE;
UPDATE test
SET parent = 98
WHERE id = 4;
pool.query(query, function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
connection.release();
});
pool.query(query, function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
connection.release();
});
我的第一个猜测是,池将创建单独的连接,并且在同一连接中发送查询与在同一终端中输入查询相同。但是文档在介绍部分说https://github.com/mysqljs/mysql#pooling-connections
您在连接上调用的每个方法都会排队并在 顺序。
我不确定这是什么意思。
另外,如果我使用连接池,我能否 100% 确定并发运行的查询由不同的会话处理?例如,如果第一个查询中没有释放池,那么第二个查询是否总是由另一个会话执行?
【问题讨论】:
标签: mysql sql node.js acid isolation