PHP的PDO事务与自动提交

PHP PDO 事务与自动提交

现在通过 PDO 连接上了,在开始进行查询前,必须先理解 PDO 是如何管理事务的。

事务支持四大特性(ACID):

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

通俗地讲,在一个事务中执行的任何操作,即使是分阶段执行的,也能保证安全地应用于数据库,并在提交时不会受到来自其他连接的干扰。

事务操作也可以根据请求自动撤销(假设还没有提交),这使得在脚本中处理错误更加容易。

事务通常是通过把一批更改"积蓄"起来然后使之同时生效而实现的;这样做的好处是可以大大地提供这些更改的效率。

换句话说,事务可以使脚本更快,而且可能更健壮(不过需要正确地使用事务才能获得这样的好处)。

不幸的是,并非每种数据库都支持事务,因此当第一次打开连接时,PDO 需要在所谓的"自动提交"模式下运行。

自动提交模式意味着,如果数据库支持,运行的每个查询都有它自己的隐式事务,如果数据库不支持事务,则没有。

如果需要一个事务,则必须用PDO::beginTransaction() 方法来启动。如果底层驱动不支持事务,则抛出一个 PDOException 异常(不管错误处理设置是怎样的,这都是一个严重的错误状态)。

一旦开始了事务,可用PDO::commit()PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。

注意:PDO

仅在驱动层检查是否具有事务处理能力。如果某些运行时条件意味着事务不可用,且数据库服务接受请求去启动一个事务,PDO::beginTransaction()将仍然返回 TRUE 而且没有错误。 试着在 MySQL 数据库的 MyISAM 数据表中使用事务就是一个很好的例子。

当脚本结束或连接即将被关闭时,如果尚有一个未完成的事务,那么 PDO 将自动回滚该事务。这种安全措施有助于在脚本意外终止时避免出现不一致的情况——如果没有显式地提交事务,那么假设是某个地方出错了,所以执行回滚来保证数据安全。

注意:只有通过PDO::beginTransaction()启动一个事务后,才可能发生自动回滚。如果手动发出一条查询启动事务, 则 PDO 无法知晓,从而在必要时不能进行回滚。

在事务中执行批处理:

在下面例子中,假设为新员工创建一组条目,分配一个为23的ID。除了登记此人的基本数据之外,还需要记录他的工资。

两个更新分别完成起来很简单,但通过封闭在PDO::beginTransaction()PDO::commit()调用中,可以保证在更改完成之前,其他人无法看到这些更改。

如果发生了错误,catch 块回滚自事务启动以来发生的所有更改,并输出一条错误信息。

<?php
try {
 $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2',
   array(PDO::ATTR_PERSISTENT => true));
 echo "Connected\n";
} catch (Exception $e) {
 die("Unable to connect: " . $e->getMessage());
}
try {
 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $dbh->beginTransaction();
 $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
 $dbh->exec("insert into salarychange (id, amount, changedate)
   values (23, 50000, NOW())");
 $dbh->commit();
} catch (Exception $e) {
 $dbh->rollBack();
 echo "Failed: " . $e->getMessage();
}
?>

并不局限于在事务中更改,也可以发出复杂的查询来提取数据,还可以使用那些信息来构建更多的更改和查询;当事务激活时,可以保证其他人在操作进行当中无法作出更改。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • PHP的PDO预定义常量讲解

    PHP PDO预定义常量 以下常量由本扩展模块定义,因此只有在本扩展的模块被编译到PHP中,或者在运行时被动态加载后才有效. 注意:PDO使用类常量自PHP 5.1.以前的版本使用的全局常量形式PDO_PARAM_BOOL中. PDO::PARAM_BOOL (integer) 表示布尔数据类型. PDO::PARAM_NULL (integer) 表示 SQL 中的 NULL 数据类型. PDO::PARAM_INT (integer) 表示 SQL 中的整型. PDO::PARAM_STR

  • PHP的PDO大对象(LOBs)

    PHP PDO 大对象 (LOBs) 应用程序在某一时刻,可能需要在数据库中存储"大"数据. "大"通常意味着"大约 4kb 或以上",尽管某些数据库在数据达到"大"之前可以轻松地处理多达 32kb 的数据.大对象本质上可能是文本或二进制. 在PDOStatement::bindParam()或PDOStatement::bindColumn())调用中使用PDO::PARAM_LOB类型码可以让 PDO使用大数据类型. PD

  • PHP的mysqli_ssl_set()函数讲解

    PHP mysqli_ssl_set() 函数 实例 创建 SSL 连接: <?php $con=mysqli_init(); if (!$con) { die("mysqli_init failed"); } mysqli_ssl_set($con,"key.pem","cert.pem","cacert.pem",NULL,NULL); if (!mysqli_real_connect($con,"loca

  • PHP的PDO错误与错误处理

    PHP PDO 错误与错误处理 PDO::ERRMODE_SILENT 此为默认模式. PDO 将只简单地设置错误码,可使用PDO::errorCode()和PDO::errorInfo()方法来检查语句和数据库对象.如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的PDOStatement::errorCode()或 PDOStatement::errorInfo()方法.如果错误是由于调用数据库对象而产生的,那么可以在数据库对象上调用上述两个方法. PDO::ERRMODE_WA

  • PHP的PDO预处理语句与存储过程

    PHP PDO 预处理语句与存储过程 很多更成熟的数据库都支持预处理语句的概念. 什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制.预处理语句可以带来两大好处: 查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次.当查询准备好后,数据库将分析.编译和优化执行该查询的计划.对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度.通过使用预处理语句,可以避免重复分析/编译/优化周期

  • PHP的mysqli_thread_id()函数讲解

    PHP mysqli_thread_id() 函数 返回当前连接的线程 ID,然后杀死连接: <?php // 假定数据库用户名:root,密码:123456,数据库:codingdict $con=mysqli_connect("localhost","root","123456","codingdict"); if (mysqli_connect_errno($con)) { echo "连接 MySQL

  • PHP的mysqli_stmt_init()函数讲解

    PHP mysqli_stmt_init() 函数 初始化声明并返回 mysqli_stmt_prepare() 使用的对象: <?php // 假定数据库用户名:root,密码:123456,数据库:codingdict $con=mysqli_connect("localhost","root","123456","codingdict"); if (mysqli_connect_errno($con)) { ech

  • PHP的mysqli_sqlstate()函数讲解

    PHP mysqli_sqlstate() 函数 返回最后一个 MySQL 操作的 SQLSTATE 错误代码: <?php // 假定数据库用户名:root,密码:123456,数据库:codingdict $con=mysqli_connect("localhost","root","123456","codingdict"); if (mysqli_connect_errno($con)) { echo "

  • PDO::inTransaction讲解

    PDO::inTransaction PDO::inTransaction - 检查是否在一个事务内(PHP 5 >= 5.3.3, Bundled pdo_pgsql) 说明 语法 bool PDO::inTransaction ( void ) 检查驱动内的一个事务当前是否处于激活.此方法仅对支持事务的数据库驱动起作用. 参数 此函数没有参数. 返回值 如果当前事务处于激活,则返回 TRUE ,否则返回 FALSE . 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具

  • PDO::lastInsertId讲解

    PDO::lastInsertId PDO::lastInsertId - 返回最后插入行的ID或序列值(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 string PDO::lastInsertId ([ string $name = NULL ] ) 返回最后插入行的ID,或者是一个序列对象最后的值,取决于底层的驱动.比如,PDO_PGSQL() 要求为 name 参数指定序列对象的名称. 注意:在不同的 PDO 驱动之间,此方法可能不会返回一个有意义或

随机推荐