事务处理
事务 (transaction) 是由查询和/或更新语句的序列组成。用 begin、start transaction 开始事务,rollback 回滚事务,commit 提交事务。
在开始事务后,可以有若干个 SQL 查询或更新语句,每个 SQL 递交执行后,还应该有判断是否正确执行的语句,以确定下一步是否回滚,若都被正确执行则最后提交事务。
事务一旦回滚,数据库则保持开始事务前状态。就好象一个被编辑的文件不存盘退出,自然还是保持文件原来的样子。
所以,事务可被视为原子操作,事务中的 SQL,要么全部执行,要不一句都不执行。
如果需要一个事务,则必须用 PDO::beginTransaction() 方法来启动,一旦开始了事务,可用 PDO::commit() 或 PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。
Tips: MySQL只有 InnoDB 驱动支持事务处理,默认 MyIsAM 驱动不支持。
代码示例
连接数据库:
<?php
try {
// 数据库 PDO 连接
$pdo = new \PDO('mysql:host=localhost;dbname=mydb', 'root', 'root', array(PDO::ATTR_PERSISTENT => true));
// 开启异常处理
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
echo "数据库连接失败:".$e->getMessage();
exit;
}
事务处理:
在下面例子中,假设为新员工创建一组条目,分配一个为 23 的 ID。除了登记资料,还需要记录工资。
<?php
try {
// 开启事务处理
$pdo->beginTransaction();
// 执行 SQL
$sql1 = $pdo->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
if (!$sql1) {
// 抛出异常
throw new \PDOException("登记资料失败");
}
$sql2 = $pdo->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())");
if (!$sql2) {
// 抛出异常
throw new \PDOException("记录工资失败");
}
// 没有错误则提交事务
$pdo->commit();
} catch (\PDOException $e) {
// 遇到错误则回滚事务
$pdo->rollBack();
echo "Failed: " . $e->getMessage();
}