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 相关文章推荐
一个目录遍历函数
Oct 09 PHP
处理单名多值表单的详解
Jun 08 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
详解PHP原生DOM对象操作XML的方法
Oct 17 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
Feb 20 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
Yii框架应用组件用法实例分析
May 15 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 项目的方法
2007/01/02 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
微信小程序picker组件简单用法示例【附demo源码下载】
2017/12/05 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
linux环境下Django的安装配置详解
2019/07/22 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
英国时尚家具、家居饰品及礼品商店:Graham & Green
2016/09/15 全球购物
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
实习生的自我评价
2014/01/08 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
中药专业自荐信范文
2014/03/18 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
铣工实训报告
2014/11/05 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
寒假生活随笔
2015/08/15 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
教师教育心得体会
2016/01/19 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js