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 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
php 异常处理实现代码
Mar 10 PHP
PHP中simplexml_load_string函数使用说明
Jan 01 PHP
ThinkPHP采用模块和操作分析
Apr 18 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
php二分查找二种实现示例
Mar 12 PHP
destoon找回管理员密码的方法
Jun 21 PHP
smarty模板引擎基础知识入门
Mar 30 PHP
深入了解PHP中的Array数组和foreach
Nov 06 PHP
ThinkPHP框架分布式数据库连接方法详解
Mar 14 PHP
php 函数使用可变数量的参数方法
May 02 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
php+mysql分页代码详解
2008/03/27 PHP
PHP 类型转换函数intval
2009/06/20 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
jqueryUI tab标签页代码分享
2017/10/09 jQuery
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
vue中格式化时间过滤器代码实例
2019/04/17 Javascript
简化Python的Django框架代码的一些示例
2015/04/20 Python
浅析Python中元祖、列表和字典的区别
2016/08/17 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python高斯消除矩阵
2019/01/02 Python
Python 实现try重新执行
2019/12/21 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
iPhoneX安全区域(Safe Area)底部小黑条在微信小程序和H5的屏幕适配
2020/04/08 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
软件测试面试题
2014/01/05 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
初中化学教学反思
2014/01/23 职场文书
生物科学专业职业规划书范文
2014/02/11 职场文书
经济贸易系求职信
2014/08/04 职场文书
争先创优演讲稿
2014/09/15 职场文书
民主生活会发言材料
2014/10/20 职场文书
golang slice元素去重操作
2021/04/30 Golang
golang连接MySQl使用sqlx库
2022/04/14 Golang