我很擅长使用数据库。我目前正在使用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行时开始吗?我只是想知道我对这个过程的理解(以及代码的编写方式)是否准确。
答案 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()将回滚对数据库的所有更改 将连接返回到自动提交模式。