【问题标题】:Temporarily lock MYSQL table while querying?查询时临时锁定MYSQL表?
【发布时间】:2015-01-20 20:35:37
【问题描述】:

我对使用数据库非常陌生。我目前正在使用 Google Cloud SQL 并通过 PHP PDO 访问数据库。

我设法找到了一个包含一些示例代码的网站 (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers):

<?php
try {
    $db->beginTransaction(); //<---- 1

    $db->exec("SOME QUERY"); //<---- 2

    $stmt = $db->prepare("SOME OTHER QUERY?");
    $stmt->execute(array($value));

    $stmt = $db->prepare("YET ANOTHER QUERY??");
    $stmt->execute(array($value2, $value3));

    $db->commit(); //<---- 3
} catch(PDOException $ex) {
    //Something went wrong rollback!
    $db->rollBack();
    echo $ex->getMessage();
}

根据上面的代码,如果我做了'$db->beginTransaction();',会开始锁定表吗?然后 '$db->e​​xec("SOME QUERY");'会正常的。最后,'$db->commit();'会保存上面的所有内容并解锁表格吗?

如果一切正常运行,那么我是否应该假设当第 2 行正在运行时,不能完成对表的其他调用(它们将排队)并且其他调用只能在调用第 3 行后开始?我只是想知道我对这个过程(以及代码是如何编写的)的理解是否准确。

【问题讨论】:

  • 是的,事务将停止对 exec 语句中的表进行的任何更改。您可以通过at the mysql docs 获取有关交易的完整详细信息(除此之外还有很多其他内容)。

标签: php mysql pdo transactions


【解决方案1】:

首先,由于您使用的是 try/catch,因此您要确保 PDO 的错误模式是异常:http://php.net/manual/en/pdo.error-handling.php,默认情况下它是静默的。

然后,是的,当查询失败时,PDO 应该发出一个异常,该异常将停止执行try 部分。在catch 期间,您应该发出rollBack(),如果一切成功,您应该发出commit()。所以你怎么看对我来说是正确的。

启动事务后,在您运行 commit() 之前,该连接中的任何内容都不会被保存。 rollBack() 结束事务并返回自动提交模式而不保存任何更改。

来自http://php.net/manual/en/pdo.begintransaction.php

关闭自动提交模式。当自动提交模式关闭时, 通过 PDO 对象实例对数据库所做的更改不是 提交直到您通过调用 PDO::commit() 结束事务。 调用 PDO::rollBack() 将回滚对数据库的所有更改并 将连接返回到自动提交模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2014-04-30
    • 2013-02-27
    • 2013-08-09
    相关资源
    最近更新 更多