MariaDB使SELECT等待其他事务完成

iqjalb3h  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(136)

我在MariaDB 10.6.5上,我有以下代码:

$pdo->query("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;");
$pdo->query("SET autocommit = 0;");

try
{
    $max_id = $pdo->query("SELECT MAX(id) FROM test")->fetchColumn();
    sleep(3);
    $insert_sql = $pdo->prepare("INSERT INTO test(test) VALUES(:test)");
    $insert_sql->execute(['test' => $max_id + 1]);
}
catch (Throwable $e)
{
    $pdo->query("ROLLBACK;");
}

$pdo->query("COMMIT;");

test表有两列:id(自动递增)和test(整数)。
当两个用户同时执行此代码时,我希望第一个事务在SELECT语句处锁定test表,而第二个事务在SELECT语句处等待第一个事务完成。如果一切顺利,则id列应始终等于test列。
这是可能的吗?如果是的话,怎么可能?
为了澄清,我希望发生以下情况:

  • 两个用户U1U2同时运行此代码,U1提前几微秒运行它
  • U1运行SELECT语句,锁定表test
  • U1运行INSERT语句
  • U1运行COMMIT语句,从而解锁表test
  • U2运行SELECT语句,在U1INSERT之后读取新的MAX(id)
  • U2运行INSERT语句
  • U2运行COMMIT语句
t3psigkw

t3psigkw1#

您可以使用GET_LOCK
在开始处添加查询DO GET_LOCK('lockname', 30),并在查询之后添加DO RELEASE_LOCK('lockname')
因此,当用户1启动查询时,它会设置锁lockname,并仅在完成时释放它。如果用户2启动脚本DO GET_LOCK('lockname', 30),则会在继续之前等待锁被释放。

相关问题