《细说PHP》第四版 样章 第18章 数据库抽象层PDO 9
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的更多相关文章
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 1
现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用My ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12
18.9 管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 11
18.8.3 完美分页类的代码实现 分页类的编写除了需要使用在18.8.2节中提供的可以操作的3个成员方法,还需要更多的成员,但其他的成员方法和成员属性只需要内部使用,并不需要用户在对象外部操作,所 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 7
18.6 PDO对预处理语句的支持 在生成网页时,许多PHP脚本通常都会执行除参数外其他部分完全相同的查询语句.针对这种重复执行一个查询,但每次迭代使用不同参数的情况,PDO提供了一种名为预处理语句 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 4
18.4 创建PDO对象 使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象.在通过构造方法创 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 10
18.8 设计完美分页类 数据记录列表几乎出现在Web项目的每个模块中,假设一张表中有十几万条记录,我们不可能一次全都显示出来,当然也不能仅显示几十条.为了解决这样的矛盾,通常在读取时设置以分页的形 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8-1
18.6.5 获取数据 PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成.不管使用PDO对象中的query()方法,还是使用prepare()和exe ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8
18.6.4 执行准备好的查询 当准备好查询并绑定了相应的参数后,就可以通过调用PDOStatement类对象中的execute()方法,反复执行在数据库缓存区准备好的语句了.在下面的示例中,向前面 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 6
18.5.3 PDO的错误处理模式 PDO共提供了3种不同的错误处理模式,不仅可以满足不同风格的编程,也可以调整扩展处理错误的方式. 1.PDO::ERRMODE_SILENT 这是默认模式,在错误 ...
随机推荐
- nginx基础(3)
目录 HTTP首部 1.通用首部 2.请求首部 2.1 必有首部 2.2 条件请求首部 2.3 安全相关首部 3.响应首部 3.1 必有首部 3.2 协商首部 3.3 安全相关首部 4.实体首部 4. ...
- 关于jQuery MiniUI
jQuery MiniUI v3.0 jQuery MiniUI - 专业WebUI控件库.它能缩短开发时间,减少代码量,使开发者更专注于业务和服务端,轻松实现界面开发,带来绝佳的用户体验. http ...
- Office批量打印助手(Excel 批量打印、Word 批量打印)
最新版本:1.0.6664.34636(更新日期:2018年3月31日) 下载地址:点击下载 程序简介: 本程序能批量打印 Word 文件.Excel 工作簿. 使用程序前请先安装 .NET Fra ...
- Java连载56-toSting方法和equals方法
一.关于object中的toString方法: 1.SUN公司在Object类中设计toString方法的目的:返回java对象的字符串的表示形式. 2.在现实的开发过程中,Object里面的toS ...
- Codeforces Round #590 D. Distinct Characters Queries
CF上给的标签是数据结构.但给的题解里的方法是很巧的暴力,用vector<set>维护每个字母出现的下标,每次修改加下标,擦下标.每次询问对每个字母分别lower_bound查找区间内是否 ...
- 【第二章】Zabbix3.4监控SQLServer数据库和H3C交换机思科Cisco防火墙交换机教程笔记
监控SQLServer数据库 SSMS执行相关SQL SQL模板命名规则 Zabbix客户端导入模板 添加SQLServer监控图形 SQLServer服务器关联模板 监控思科Cisco防火墙交换机 ...
- 朝花夕拾《精通CSS》三、对一些标签元素的使用
一.背景 翻出我4年前看的<精通CSS>一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西.知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 b ...
- np.array()和np.dot()的区别
1.生成数组的方式不同 2.乘法计算方式不同 array生成数组,np.dot()表示矩阵乘积,(*)号或np.multiply()表示点乘 mat生成数组,(*)和np.dot()表示矩阵相乘,点乘 ...
- 易优CMS:arclist 文档列表
arclist 文档列表(配合arcpagelist标签可实现ajax瀑布流分页) [基础用法] 名称:arclist 功能:获取系统主从表模型(如:文章.软件.图集.产品等)的一列文档,也称自由列 ...
- go语言之数据类型和格式化输出
1.数据类型 package main import ( "fmt" "reflect" ) func main() { //整形 var v1 int32 v ...