gpt4 book ai didi

MySQL、Perl DBI、execute() 和锁定(锁定的精确时刻)

转载 作者:行者123 更新时间:2023-11-29 04:38:19 26 4
gpt4 key购买 nike

我正在开发 Perl/DBI/DBD/MySQL 应用程序。我正在使用事务级别为“可重复读取”和“autocommit = 0”的 InnoDB。为了保护我正在操作的数据免受其他线程或连接的并发操作,我使用以下模式(这很常见):

$h_DB -> do("START TRANSACTION");

$s_SQL = "SELECT data from Users where ID = ? FOR UPDATE";
$h_ST = $h_DB -> prepare($s_SQL);
$h_ST -> execute($s_ID);

# Do some other stuff

@ar_Row = $h_ST -> fetchrow_array();

# Do data manipulation

$h_DB -> do("COMMIT")

为了清楚起见,我省略了错误处理和变量声明,但我认为变量名是不言自明的。

我的问题是:锁(在本例中为独占锁)到底是什么时候加到相应行上的?它们在执行运行后是否已经就位,或者它们是否在获取行后立即处于事件状态?换句话说,是否已在指定的“# Do some other stuff”部分锁定?

通常,使用 MySQL 命令行工具进行一些研究很容易回答此类问题。但在这种情况下,我认为这是不可能的,原因如下:

1) 我不确定 MySQL 客户端的行为是否与 Perl 的 DBI/DBD 完全一样。

2) 当然,上面的例子是极其简化的。实际上,我想知道使用上述模式时何时设置锁,但一次锁定数百行,即匹配 WHERE 子句的数百行。

我不认为我可以使用命令行客户端来找出答案,因为对于大型数据集,可能会有缓冲,Perl 和命令行客户端可能会以不同方式处理它,我怀疑我是否可以“模拟”一个已在 Perl 中执行的语句,但尚未通过在命令行客户端中使用类似“LIMIT 0”的内容来获取其结果行。

谁能给个明确的答案?

最佳答案

$s_SQL = "SELECT data from Users where ID = ? FOR UPDATE";

执行此操作将尝试获取受影响行的锁,然后获取数据(或等待直到获得所有受影响行的独占锁)。这样做是为了线程安全并且只返回已经锁定的数据:这样可以保证服务器返回最新的数据,不能被任何其他客户端/线程修改。

行将被锁定,直到提交或回滚。

MySQL cli 客户端中的行为与锁定是在服务器中而不是在客户端库中完成的相同。

这只适用于 MySQL InnoDB 表。 MyISAM 等其他引擎的行为有所不同。

关于MySQL、Perl DBI、execute() 和锁定(锁定的精确时刻),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35848981/

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