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
来自PHP.NET的入门教程
Oct 09 PHP
用PHP实现图象锐化代码
Jun 14 PHP
php 清除网页病毒的方法
Dec 05 PHP
php curl登陆qq后获取用户信息时证书错误
Feb 03 PHP
php实现字符串反转输出的方法
Mar 14 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
round robin权重轮循算法php实现代码
May 28 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 PHP
php变量与字符串的增删改查操作示例
May 07 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
使用PHP强制下载PDF文件示例
2014/01/17 PHP
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
需要牢记的JavaScript基础知识
2016/09/25 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
Python笔记(叁)继续学习
2012/10/24 Python
Python执行时间的计算方法小结
2017/03/17 Python
一篇文章快速了解Python的GIL
2018/01/12 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
Python简单基础小程序的实例代码
2019/04/28 Python
python getpass实现密文实例详解
2019/09/24 Python
通过实例解析python描述符原理作用
2020/01/22 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
python退出循环的方法
2020/06/18 Python
送餐员岗位职责范本
2014/02/21 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
优秀班组长事迹
2014/05/31 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android
使用CSS实现音波加载效果
2023/05/07 HTML / CSS