PHP的PDO事务与自动提交


Posted in PHP onJanuary 24, 2019

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();
}
?>

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

总结

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

PHP 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
第四节--构造函数和析构函数
Nov 16 PHP
配置支持SSI
Nov 25 PHP
PHP 读取文件内容代码(txt,js等)
Dec 06 PHP
创建数据库php代码 用PHP写出自己的BLOG系统
Apr 12 PHP
实用PHP会员权限控制实现原理分析
May 29 PHP
PHP的一个基础知识 表单提交
Jul 04 PHP
基于Zend的Captcha机制的应用
May 02 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
PHP中Memcache操作类及用法实例
Dec 12 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
thinkphp 获取控制器及控制器方法
Apr 16 PHP
PHP的PDO连接讲解
Jan 24 #PHP
PHP的PDO预定义常量讲解
Jan 24 #PHP
PHP的mysqli_thread_id()函数讲解
Jan 24 #PHP
PHP的mysqli_stmt_init()函数讲解
Jan 24 #PHP
详解php伪造Referer请求反盗链资源
Jan 24 #PHP
PHP的mysqli_stat()函数讲解
Jan 23 #PHP
PHP的mysqli_ssl_set()函数讲解
Jan 23 #PHP
You might like
php 用sock技术发送邮件的函数
2007/07/21 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
Laravel用户授权系统的使用方法示例
2018/09/16 PHP
JS 控制CSS样式表
2009/08/20 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
2014/06/24 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
jQuery插件zTree实现清空选中第一个节点所有子节点的方法
2017/03/08 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
获取Django项目的全部url方法详解
2017/10/26 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
Python3日期与时间戳转换的几种方法详解
2019/06/04 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
深入了解Python enumerate和zip
2020/07/16 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
企业门卫岗位职责
2013/12/12 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
挂职学习心得体会
2014/09/09 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
初三语文教学反思
2016/03/03 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
六年级作文之家庭作文
2019/12/12 职场文书
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang