gpt4 book ai didi

php - PDO 交易 api 如何工作?

转载 作者:行者123 更新时间:2023-11-28 23:28:18 25 4
gpt4 key购买 nike

这是我的代码结构:

// db connection here

try {
$dbh_conn->beginTransaction();

$stm = $dbh_conn->prepare("SELECT user_id FROM resend_pass WHERE token = ?");
$stm->execute(array('value'));
$num_rows = $stm->fetch(PDO::FETCH_ASSOC);

if($num_rows) {
echo 'one'; die;

} else {
echo 'two'; die;

}

$dbh_conn->commit();

} catch(PDOException $e) {
$dbh_conn->rollBack();

echo 'three'; die;

}

该查询具体何时执行?你知道,我的脚本完全符合预期。但我想知道如何?如您所见,在 commite() 之前有一个 if - else 语句;此外,ifelse 的 block 中都有 die;。据我所知,这条线永远不会执行:

$dbh_conn->commit();

因为它前面确实有一个die。但令人惊讶的是,我的代码也能正常工作。这是所有可能的输出:

  • 如果 value 作为 token 存在于 resend_pass 表中,它会打印 one
  • 如果 value 不作为 token 存在于 resend_pass 表中,它会打印 two
  • 如果出现错误(如语法 SQL 错误),它会打印 three

看到了吗?一切都很好。但是怎么办? commit() 函数何时执行?在那些之前?

注意:resend_pass的引擎是innoDB

最佳答案

查询在 execute() 被调用时执行(注意 query() 调用 execute())。

如果查询更改了支持事务的表中的数据,如果 PDO 对象被释放,更改将回滚,因为对象超出范围或脚本终止并清理。这是由于 PDO 代码,而不是 MySQL。

如果查询更改了不支持事务的表(例如 MyISAM 表)中的数据,则更改在执行时是永久性的,并且无法回滚。

有一些SQL statements that perform an implicit commit .它们会在执行后立即成为永久性的,即使您的脚本在调用 commit() 之前终止也是如此。

如@MarcB 所述,您的示例显示了一个只读的 SELECT 语句。如果使用 INSERT/UPDATE/DELETE,测试行为会更容易。

关于php - PDO 交易 api 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38405371/

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