PHP使用pdo实现事务处理操作示例


Posted in PHP onSeptember 05, 2018

本文实例讲述了PHP使用pdo实现事务处理操作。分享给大家供大家参考,具体如下:

使用事务的好处:

举个例子:银行用户A向用户B转账100元,这个操作被分为两个步骤:

(1)A的账户余额被扣去100。

(2)B的账户余额增加100。

如果不使用事务的话,假设(1)执行成功了,而(2)失败了,那用户B没有收到应收款项,而用户A就白白受了损失。

使用事务之后,不论(1)或者(2)哪一步失败,都可以回滚,即双方的账户余额恢复到之前的状态。

不是所有的数据库都提供了对事务的支持,如mysql中的 Myisam 引擎不支持事务,但新版本默认使用的 innoDB 引擎提供了对事务的支持。(RDBMS大部分支持事务,NoSQL数据库一般不支持事务)

下面来看具体的代码:

<?php
$dsn   = "mysql:dbname=pdo;host=localhost";
$user   = "root";
$password = "root";
$dbh   = new PDO($dsn, $user, $password);
//使用事务之前,要先关闭自动提交。不关闭的话,出现异常的时候没法回滚。
//据手册描述,ATTR_AUTOCOMMIT属性只在mysql,OCI(oracle),firebird三种数据库中可用
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);
$cash = 100;
try {
  $dbh->beginTransaction();
  //用户A账户扣除100
  $sqlcmd    = "update transaction set useraccount=useraccount - {$cash} where username ='A'";
  $affected_rows = $dbh->exec($sqlcmd);
  if ($affected_rows > 0) {
    echo "用户A账户扣除成功" . "<br>";
  } else {
    throw new Exception("用户A账户扣除失败");
  }
  //用户B账户增加100
  $affected_rows = $dbh->exec("update transaction set useraccount=useraccount+{$cash} where username ='B'");
  if ($affected_rows > 0) {
    echo "用户B账户增加成功" . "<br>";
  } else {
    throw new Exception("用户B账户增加失败");
  }
  echo "转账成功";
  //若前面两个步骤都成功,则提交事务
  $dbh->commit();
}
catch (PDOException $e) //若前面两个步骤中出现了异常,则回滚
  {
  echo $e->getMessage();
  $dbh->rollback();
}
//对事物的使用结束之后,重新开启自动提交
$dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, 1);
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 5.0对象模型深度探索之绑定
Sep 05 PHP
PHP生成便于打印的网页
Oct 09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
destoon数据库表说明汇总
Jul 15 PHP
php通过正则表达式记取数据来读取xml的方法
Mar 09 PHP
php header函数的常用http头设置
Jun 25 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
Jan 13 PHP
php中bind_param()函数用法分析
Mar 28 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
laradock环境docker-compose操作详解
Jul 29 PHP
php上传后台无法收到数据解决方法
Oct 28 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 #PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 #PHP
PHP时间处理类操作示例
Sep 05 #PHP
PHP命名空间与自动加载类详解
Sep 04 #PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 #PHP
php 后端实现JWT认证方法示例
Sep 04 #PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 #PHP
You might like
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
php使用websocket示例详解
2014/03/12 PHP
Laravel框架数据库CURD操作、连贯操作总结
2014/09/03 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
jQuery的链式调用浅析
2010/12/03 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
js 时间函数应用加、减、比较、格式转换的示例代码
2013/08/23 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
微信小程序实现提交input信息到后台的方法示例
2019/01/19 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
Flask实现图片的上传、下载及展示示例代码
2018/08/03 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python deque模块简单使用代码实例
2020/03/12 Python
python 实现两个线程交替执行
2020/05/02 Python
python 线程的五个状态
2020/09/22 Python
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
水果超市创业计划书
2014/01/27 职场文书
应用外语系自荐信
2014/06/26 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
公司辞职信模板
2015/05/13 职场文书
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android