尝试获取咨询锁时: https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock
我收到了null
响应,而不是MySQL文档中指定的0
或1
,并且当我通过MySQL客户端发出查询时看到了。
import test from 'ava'
import mysql from 'mysql1'
const pool = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
port: 3306,
database: 'test',
password: '',
})
const foo = () => new Promise((resolve) => {
resolve(1)
})
const multiQuery = () => new Promise((resolve, reject) => {
const sql = `
SELECT GET_LOCK('test2', -1) AS test3;
`
pool.query(sql, (err, res) => (err == null ? resolve(res) : reject(err)))
})
test(async (t) => {
const response = await multiQuery()
console.log(response)
t.is(await foo(), 1)
})
这是预期的吗?
答案 0 :(得分:2)
MySql和MariaDB在GET_LOCK实现中存在差异。
来自MySql GET_LOCK() Documentation:
尝试使用超时秒的超时来获取具有字符串str给出的名称的锁。 否定超时值意味着无限超时。锁是独家的。由一个会话持有,其他会话无法获得同名的锁。
来自MariaDB GET_LOCK() Documentation:
尝试使用超时秒的超时来获取具有字符串str给出的名称的锁。如果成功获取锁定则返回1,如果尝试超时则返回0(例如,因为另一个客户端先前已锁定名称),如果发生错误则返回NULL(例如内存不足或线程被mysqladmin kill杀死) )。
如果发生错误,两个实现都返回NULL,但是,MariaDB不支持否定超时。因此,当将一个负整数作为超时参数传递给GET_LOCK()函数时,MariaDB将返回NULL。
提出我的查询:
SELECT GET_LOCK('test2', -1) AS test3
MariaDB将以NULL响应,MySQL将以1
响应