gpt4 book ai didi

带有嵌套 PHP 检查的 PHP PDO 事务

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

我必须执行 2 个 MySql 查询:

  1. 从 X WHERE [...] 中选择 ID

  2. 插入[...]

仅当第一个查询返回正确的 ID 时才应执行第二个查询。

是否可以在两个查询之间混合使用 PHP 条件?

例如。

try
{
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();

$stmt = $dbh->prepare("SELECT id FROM [...]");

$stmt->bindParam(1, [...]);

if($stmt->execute())
{
if($row = $stmt->fetch())
{
$matchID = $row['id'];
$checkD = $this->checkId($matchID);

if($checkD)
{
return '-1';
}
else
{

$stmt = $dbh->prepare("INSERT INTO [...]");

$stmt->bindParam(1,[...]);
$stmt->execute();

stmt = $dbh->prepare("DELETE [...]");

$stmt->bindParam(1,[...]);
$stmt->execute();

$dbh->commit();

return $matchID;
}
}
else
{
return '-1';
}
}
else
{
return '-1';
}
} catch(Exception $e)
{
$dbh->rollBack();
return '-1';
}

这是正确的吗? (我得到零错误)如果不是:我怎样才能实现它?

我想确保,当另一个用户执行 1. 查询时,其他用户无法访问 INSERT 查询。

最佳答案

交易与当前数据隔离。它们的具体行为取决于 isolation level他们使用。例如,具有可序列化隔离级别的事务完全存在于过去,并且它不知道自事务开始以来发生的任何数据更改。

如果您想阻止任何人在您的脚本正在处理某些内容时对数据库进行更改,那么您必须 lock您的数据库、表或行。如果使用正确的代码,这通常是不必要的。

就你的情况

  • 您可以使用读已提交事务隔离级别(默认)调用 DELETE SELECT之后,并检查是否有 DELETE 受影响的行之前INSERT
  • 如果您不想更改查询顺序,则可以
    • 如果DELETE则简单地抛出异常不影响任何行,因此 INSERT将被回滚
    • 添加一个约束来防止多个 INSERT具有相同的数据,因此重复的 INSERT会违反约束,并且会被回滚
    • 使用 SELECT FOR UPDATE 锁定行

关于带有嵌套 PHP 检查的 PHP PDO 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24033110/

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