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 相关文章推荐
一个图形显示IP的PHP程序代码
Oct 19 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
smarty中常用方法实例总结
Aug 07 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 PHP
php版微信公众平台开发之验证步骤实例详解
Sep 23 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
Oct 23 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
php如何利用pecl安装mongodb扩展详解
Jan 09 PHP
Laravel中Kafka的使用详解
Mar 24 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
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
php rsa加密解密使用详解
2015/01/14 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
深入剖析JavaScript中的函数currying柯里化
2016/04/29 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
vue项目中仿element-ui弹框效果的实例代码
2019/04/22 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
JavaScript逻辑运算符相关总结
2020/09/04 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
Python获取脚本所在目录的正确方法
2014/04/15 Python
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
tensorflow之获取tensor的shape作为max_pool的ksize实例
2020/01/04 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
村优秀党员事迹材料
2014/01/15 职场文书
治超工作实施方案
2014/05/04 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
2015年医德考评自我评价
2015/03/03 职场文书