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抓即时股票信息
Oct 09 PHP
mysql 字段类型说明
Apr 27 PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
May 18 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
基于PHP实现简单的随机抽奖小程序
Jan 05 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
CI框架简单邮件发送类实例
May 18 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
自制PHP框架之设计模式
May 07 PHP
PHP扩展Swoole实现实时异步任务队列示例
Apr 13 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实现Ftp用户的在线管理
2012/02/16 PHP
php网站地图生成类示例
2014/01/13 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
JS实现仿腾讯微博无刷新删除微博效果代码
2015/10/16 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Anaconda入门使用总结
2018/04/05 Python
django 发送手机验证码的示例代码
2018/04/25 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
Python人脸识别第三方库face_recognition接口说明文档
2019/05/03 Python
python中使用while循环的实例
2019/08/05 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
python自动化发送邮件实例讲解
2021/01/04 Python
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
如何写一份好的英文求职信
2014/03/19 职场文书
护士医德医风自我评价
2014/09/15 职场文书
检讨书格式范文
2015/05/07 职场文书
董事长新年致辞
2015/07/29 职场文书
消防演习感想
2015/08/10 职场文书
vue3中的组件间通信
2021/03/31 Vue.js