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+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
PHP缓存技术的多种方法小结
Aug 14 PHP
php简单获取目录列表的方法
Mar 24 PHP
php生成圆角图片的方法
Apr 07 PHP
PHP中curl_setopt函数用法实例分析
Apr 16 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
PHP5.6读写excel表格文件操作示例
Feb 26 PHP
php tpl模板引擎定义与使用示例
Aug 09 PHP
Laravel使用swoole实现websocket主动消息推送的方法介绍
Oct 20 PHP
通过实例解析PHP数据类型转换方法
Jul 11 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
Laravel框架实现多个视图共享相同数据的方法详解
2019/07/09 PHP
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
基于jQuery的Spin Button自定义文本框数值自增或自减
2010/07/17 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
简单的Python的curses库使用教程
2015/04/11 Python
Python3之读取连接过的网络并定位的方法
2018/04/22 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
使用Python发现隐藏的wifi
2020/03/04 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
python Scrapy框架原理解析
2021/01/04 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
军训学生自我鉴定
2014/02/12 职场文书
开学典礼感言
2014/02/16 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
婚庆主持词大全
2015/06/30 职场文书
中国梦宣传标语口号
2015/12/26 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS