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 相关文章推荐
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
ThinkPHP中的常用查询语言汇总
Aug 22 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
PHP单例模式详细介绍
Jul 01 PHP
PHP面试题之文件目录操作
Oct 15 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
php将一维数组转换为每3个连续值组成的二维数组
May 06 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
laravel5环境隐藏index.php后缀(apache)的方法
Oct 12 PHP
浅谈如何提高PHP代码质量之单元测试
May 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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
用cookies来跟踪识别用户
2006/10/09 PHP
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
JavaScript关于select的相关操作说明
2010/01/13 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
JavaScript 垃圾回收机制分析
2013/10/10 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
javascript移动开发中touch触摸事件详解
2016/03/18 Javascript
文本框只能输入数字的实现方法(兼容IE火狐)
2016/06/25 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
[05:34]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY第二弹
2014/06/25 DOTA
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
python中argparse模块用法实例详解
2015/06/03 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
Python实现Kmeans聚类算法
2020/06/10 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
2020/10/15 Python
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
大学生军训感想
2014/02/16 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
小学安全汇报材料
2014/08/14 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS