来自nodejs mysql和mysql2驱动程序的建议锁定返回null

时间:2018-01-06 01:01:32

标签: mysql node.js

尝试获取咨询锁时: https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock

我收到了null响应,而不是MySQL文档中指定的01,并且当我通过My​​SQL客户端发出查询时看到了。

enter image description here

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)
})

响应: Database Driver Response

这是预期的吗?

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

响应