查询时暂时锁定MYSQL表?

时间:2014-11-22 21:18:42

标签: php mysql pdo transactions

我很擅长使用数据库。我目前正在使用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-&gt; beginTransaction();',那会开始锁定表吗?然后'$ db-&gt; exec(“有些问题”);'会是正常的。最后,'$ db-&gt; commit();'会保存上面的所有内容并解锁桌子吗?

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

1 个答案:

答案 0 :(得分:0)

首先,由于您使用的是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()将回滚对数据库的所有更改   将连接返回到自动提交模式。