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在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
PHP设计模式 注册表模式
Feb 05 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
PHP json_decode函数详细解析
Feb 17 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
PHP7.1新功能之Nullable Type用法分析
Sep 26 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
PHP的HTTP客户端Guzzle简单使用方法分析
Oct 30 PHP
Laravel框架处理用户的请求操作详解
Dec 20 PHP
PHP替换Word中变量并导出PDF图片的实现方法
Nov 26 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利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
Laravel框架使用Redis的方法详解
2018/05/30 PHP
PHP 枚举类型的管理与设计知识点总结
2020/02/13 PHP
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
React-Router如何进行页面权限管理的方法
2017/12/06 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
js中的深浅拷贝问题简析
2019/05/10 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
js实现筛选功能
2020/11/24 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
python实现查询IP地址所在地
2015/03/29 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
pyenv与virtualenv安装实现python多版本多项目管理
2019/08/17 Python
HTML5 用动画的表现形式装载图像
2016/03/08 HTML / CSS
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
一套Java笔试题
2016/08/20 面试题
揠苗助长教学反思
2014/02/04 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
高中语文课后反思
2014/04/27 职场文书
大一新生期末自我评价
2014/09/12 职场文书
2014年十一国庆节活动方案
2014/09/16 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
导游词之江南周庄
2019/12/06 职场文书
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL