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实现的功能是显示8条基色色带
Oct 09 PHP
PHP DataGrid 实现代码
Aug 12 PHP
最新的php 文件上传模型,支持多文件上传
Aug 13 PHP
解析如何用php screw加密php源代码
Jun 20 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
PHP小技巧之函数重载
Jun 02 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
Jun 13 PHP
PHP源码分析之变量的存储过程分解
Jul 03 PHP
php获取json数据所有的节点路径
May 17 PHP
php微信开发之谷歌测距
Jun 14 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
Sep 29 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
php中文乱码问题的终极解决方案汇总
2017/08/01 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
判断js的Array和Object的实现方法
2016/08/29 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
ES6学习教程之模板字符串详解
2017/10/09 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
简单上手Python中装饰器的使用
2015/07/12 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
python使用celery实现异步任务执行的例子
2019/08/28 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
CSS3 box-sizing属性
2009/04/17 HTML / CSS
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
党员证明模板
2015/06/19 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android