gpt4 book ai didi

php - PDO 锁定表行 INNODB

转载 作者:行者123 更新时间:2023-11-29 07:30:38 25 4
gpt4 key购买 nike

我有一个存储敏感数据的表,需要注意只有一个 session 能够在特定行上读/写。

我的表有 2 列id (int) 主要数量(整数)索引

所以我想锁定表格但只有一行像

LOCK TABLEROWS `mytable` WRITE WHERE `id` = 1

我在使用 pdo 和 startTransaction 时不会阻止其他 session 读/写

我阅读了 InnoDB 文档但没有让它运行

编辑:

$_PDO->exec('START TRANSACTION');
$_PDO->query('SELECT * FROM `currency` WHERE `id` = '.$userid.' FOR UPDATE');
//maybe do update or not check if
$_PDO->exec('COMMIT');

这就是我需要做的吗?

最佳答案

您展示的示例将导致其他正在执行 SELECT...FOR UPDATE 的 session 等待您的 COMMIT。 SELECT...FOR UPDATE 请求的锁是独占 锁,因此一次只有一个 session 可以获得锁。因此,如果您的 session 持有锁,其他 session 将等待。

您不能阻止非锁定读取。另一个 session 可以在没有锁定子句的情况下运行 SELECT,并且仍然读取数据。但他们无法更新数据,也无法请求锁定读取。

您也可以使用 LOCK TABLES 使每个 session 请求锁定表, 但你说你想要锁定行规模。

您可以使用 GET_LOCK() 创建自己的自定义锁功能。这允许您为每个用户 ID 设置不同的锁。如果对访问该表的所有代码执行此操作,则无需使用 FOR UPDATE

$lockName = 'currency' . (int) $userid;

$_PDO->beginTransaction();

$stmt = $_PDO->prepare("SELECT GET_LOCK(?, -1)");
$stmt->execute([$lockName]);

$stmt = $_PDO->prepare('SELECT * FROM `currency` WHERE `id` = ?');
$stmt->execute([$userid]);

//maybe do update or not check if

$_PDO->commit();

$stmt = $_PDO->prepare("SELECT RELEASE_LOCK(?)");
$stmt->execute([$lockName]);

这取决于所有客户端代码的协作。他们都需要在处理给定行之前获取锁。您可以使用 SELECT...FOR UPDATE,也可以使用 GET_LOCK()

但是您不能阻止想要使用 SELECT 进行非锁定读取的客户端。

关于php - PDO 锁定表行 INNODB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51443267/

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