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 相关文章推荐
全世界最小的php网页木马一枚 附PHP木马的防范方法
Oct 09 PHP
php中根据某年第几天计算出日期年月日的代码
Feb 24 PHP
PHP遍历数组的几种方法
Mar 22 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
PHP实现返回JSON和XML的类分享
Jan 28 PHP
PHP实现将视频转成MP4并获取视频预览图的方法
Mar 12 PHP
php验证码生成代码
Nov 11 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
php中mkdir()函数的权限问题分析
Sep 24 PHP
PHP上传文件及图片到七牛的方法
Jul 25 PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 PHP
php设计模式之观察者模式定义与用法经典示例
Sep 19 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与SQL注入攻击[一]
2007/04/17 PHP
Destoon模板制作简明教程
2014/06/20 PHP
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
PHP利用curl发送HTTP请求的实例代码
2020/07/09 PHP
js替换字符串的所有示例代码
2013/07/23 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
JavaScript 七大技巧(二)
2015/12/13 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
Python过滤列表用法实例分析
2016/04/29 Python
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Python多线程的退出控制实现
2020/08/10 Python
Django如何批量创建Model
2020/09/01 Python
CSS3 选择器 伪类选择器介绍
2012/01/21 HTML / CSS
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
基本款天堂:Everlane
2017/05/13 全球购物
电焊工工作岗位职责
2014/02/06 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
房屋转让协议书范本
2014/04/11 职场文书
优质服务活动实施方案
2014/05/02 职场文书
授权委托书格式范文
2014/08/02 职场文书
党的生日演讲稿
2014/09/10 职场文书
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python