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
自己动手做一个SQL解释器
Oct 09 PHP
PHP网站基础优化方法小结
Sep 29 PHP
火车头discuz6.1 完美采集的php接口文件
Sep 13 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
PHP 验证登陆类分享
Mar 13 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
php中上传文件的的解决方案
Sep 25 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
Mar 18 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
Jul 03 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 PHP
PHP7 list() 函数修改
Mar 09 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
php printf输出格式使用说明
2010/12/05 PHP
支持中文字母数字、自定义字体php验证码代码
2012/02/27 PHP
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
Javascript绝句欣赏 一些经典的js代码
2012/02/22 Javascript
select标签模拟/美化方法采用JS外挂式插件
2013/04/01 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
Python中with及contextlib的用法详解
2017/06/08 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
selenium 多窗口切换的实现(windows)
2020/01/18 Python
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
幼儿园教师辞职信
2014/01/18 职场文书
考核评语大全
2014/04/29 职场文书
普通党员对照检查材料
2014/08/28 职场文书
面试通知单大全
2015/04/20 职场文书
Python基础之Socket通信原理
2021/04/22 Python