18.7  PDO的事务处理

事务是确保数据库一致的机制,是一个或一系列的查询,作为一个单元的一组有序的数据库操作。如果组中的所有SQL语句都操作成功,则认为事务成功,那么事务被提交,其修改将作用于所有其他数据库进程。即使在事务的组中只有一个环节操作失败,事务也不成功,整个事务将被回滚,该事务中的所有操作都将被取消。事务功能是企业级数据库的一个重要组成部分,因为很多业务过程都包括多个步骤。如果任何一个步骤操作失败,则所有步骤都不应发生。事务处理有4个重要特征:原子性(Atomicity)、一致性(Consistency)、独立性(Isolation)和持久性(Durability),即ACID。在一个事务中执行的任何工作,即使它是分阶段执行的,也一定可以保证该工作会安全地应用于数据库,并且在工作被提交时,不会受到其他连接的影响。

18.7.1  MySQL的事务处理

在MySQL 4.0及以上版本中均默认启用事务,但MySQL目前只有InnoDB和BDB两个数据表类型才支持事务,两个表类型具有相同的特性,InnoDB表类型具有比BDB还丰富的特性,速度更快,因此,建议使用InnoDB表类型。创建InnoDB类型的表实际上与创建任何其他类型的表的过程类似,如果数据库没有设置默认的表类型,就需要在创建时显式指定将表创建为InnoDB类型。创建InnoDB类型的雇员表employees,代码如下所示:

CREATE TABLE employees(…)  TYPE=InnoDB;     //使用TYPE指定表类型为InnoDB

在默认情况下,MySQL是以自动提交(autocommit)模式运行的,这就意味着所执行的每条语句都会立即写入数据库。如果使用事务安全的表格类型,是不希望有自动提交的行为的。要在当前的会话中关闭自动提交,执行如下所示的MySQL命令:

MySQL>   SET AUTOCOMMIT = 0;                         //在当前的会话中关闭自动提交

如果自动提交被打开了,必须使用如下语句开始一个事务;如果自动提交是关闭的,则不需要使用这条命令,因为当输入一条SQL语句时,一个事务将自动启动。

MySQL> START   TRANSACTION;                       //开始一个事务

在完成了一组事务的语句输入后,可以使用如下语句将其提交给数据库。这样,该事务才能在其他会话中被用户看见。

MySQL> COMMIT;                                        //提交一个事务给数据库

如果改变主意,可以使用如下语句将数据库回到以前的状态。

MySQL> ROOLBACK;                                     //事务将被回滚,所有操作都将被取消

并不是每种数据库都支持事务,PDO只为能够执行事务的数据库提供事务支持。所以当第一次打开连接时,PDO需要在“自动提交(auto-commit)”模式下运行。如果需要一个事务,那么必须使用PDO对象中的beginTransaction()方法来启动一个事务。如果底层驱动程序不支持事务,那么将会抛出一个PDOException异常。可以使用PDO对象中的commit()或rollback()方法来结束一个事务,这取决于事务中运行的代码是否成功。

18.7.2  构建事务处理的应用程序

例如,一次在线购物的过程,选好一款产品,价格为80元,采用网上银行转账方式付款。假设用户userA向用户userB的账户转账,需要从userA账户中减去80元,并向userB账户加上80元。首先,在demo数据库中准备一张InnoDB类型的数据表(account),用于保存两个用户的账户信息,包括其姓名和可用现金数据,并向表中插入userA和userB的数据记录,代码如下所示:

在下面的示例中,这个转账过程需要执行两条SQL命令,真实场景中还会有其他步骤。为了保证数据的一致性,需要把此过程变成一个事务,确保数据不会由于某个步骤执行失败而遭到破坏,代码如下所示:

在上面的示例中,模拟了userA向userB转账80元的过程。这个过程需要两条更新语句合作来完成,所以采用了事务处理,确保这两条SQL语句对数据操作的一致性。两条更新分别完成都很简单,但通过将这两条更新语句包括在beginTransaction()和commit()调用中,并通过try区块试着执行,就可以保证在更改完成之前,其他人无法看到更改。如果发生了错误,则catch区块可以回滚事务开始以来发生的所有更改,并打印一条错误消息。

《细说PHP》第四版 样章 第18章 数据库抽象层PDO 9的更多相关文章

  1. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 1

    现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用My ...

  2. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12

    18.9  管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...

  3. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 11

    18.8.3  完美分页类的代码实现 分页类的编写除了需要使用在18.8.2节中提供的可以操作的3个成员方法,还需要更多的成员,但其他的成员方法和成员属性只需要内部使用,并不需要用户在对象外部操作,所 ...

  4. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 7

    18.6  PDO对预处理语句的支持 在生成网页时,许多PHP脚本通常都会执行除参数外其他部分完全相同的查询语句.针对这种重复执行一个查询,但每次迭代使用不同参数的情况,PDO提供了一种名为预处理语句 ...

  5. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 4

    18.4  创建PDO对象 使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象.在通过构造方法创 ...

  6. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 10

    18.8  设计完美分页类 数据记录列表几乎出现在Web项目的每个模块中,假设一张表中有十几万条记录,我们不可能一次全都显示出来,当然也不能仅显示几十条.为了解决这样的矛盾,通常在读取时设置以分页的形 ...

  7. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8-1

    18.6.5  获取数据 PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成.不管使用PDO对象中的query()方法,还是使用prepare()和exe ...

  8. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8

    18.6.4  执行准备好的查询 当准备好查询并绑定了相应的参数后,就可以通过调用PDOStatement类对象中的execute()方法,反复执行在数据库缓存区准备好的语句了.在下面的示例中,向前面 ...

  9. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 6

    18.5.3  PDO的错误处理模式 PDO共提供了3种不同的错误处理模式,不仅可以满足不同风格的编程,也可以调整扩展处理错误的方式. 1.PDO::ERRMODE_SILENT 这是默认模式,在错误 ...

随机推荐

  1. nginx基础(3)

    目录 HTTP首部 1.通用首部 2.请求首部 2.1 必有首部 2.2 条件请求首部 2.3 安全相关首部 3.响应首部 3.1 必有首部 3.2 协商首部 3.3 安全相关首部 4.实体首部 4. ...

  2. 关于jQuery MiniUI

    jQuery MiniUI v3.0 jQuery MiniUI - 专业WebUI控件库.它能缩短开发时间,减少代码量,使开发者更专注于业务和服务端,轻松实现界面开发,带来绝佳的用户体验. http ...

  3. Office批量打印助手(Excel 批量打印、Word 批量打印)

    最新版本:1.0.6664.34636(更新日期:2018年3月31日) 下载地址:点击下载  程序简介: 本程序能批量打印 Word 文件.Excel 工作簿. 使用程序前请先安装 .NET Fra ...

  4. Java连载56-toSting方法和equals方法

    一.关于object中的toString​方法: 1.SUN公司在Object类中设计toString方法的目的:返回java对象的字符串的表示形式. 2.在现实的开发过程中,Object里面的toS ...

  5. Codeforces Round #590 D. Distinct Characters Queries

    CF上给的标签是数据结构.但给的题解里的方法是很巧的暴力,用vector<set>维护每个字母出现的下标,每次修改加下标,擦下标.每次询问对每个字母分别lower_bound查找区间内是否 ...

  6. 【第二章】Zabbix3.4监控SQLServer数据库和H3C交换机思科Cisco防火墙交换机教程笔记

    监控SQLServer数据库 SSMS执行相关SQL SQL模板命名规则 Zabbix客户端导入模板 添加SQLServer监控图形 SQLServer服务器关联模板 监控思科Cisco防火墙交换机 ...

  7. 朝花夕拾《精通CSS》三、对一些标签元素的使用

    一.背景 翻出我4年前看的<精通CSS>一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西.知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 b ...

  8. np.array()和np.dot()的区别

    1.生成数组的方式不同 2.乘法计算方式不同 array生成数组,np.dot()表示矩阵乘积,(*)号或np.multiply()表示点乘 mat生成数组,(*)和np.dot()表示矩阵相乘,点乘 ...

  9. 易优CMS:arclist 文档列表

    arclist 文档列表(配合arcpagelist标签可实现ajax瀑布流分页)  [基础用法] 名称:arclist 功能:获取系统主从表模型(如:文章.软件.图集.产品等)的一列文档,也称自由列 ...

  10. go语言之数据类型和格式化输出

    1.数据类型 package main import ( "fmt" "reflect" ) func main() { //整形 var v1 int32 v ...