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 相关文章推荐
使用zend studio for eclipse不能激活代码提示功能的解决办法
Oct 11 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
php数组函数序列之array_intersect() 返回两个或多个数组的交集数组
Nov 10 PHP
PHP的博客ping服务代码
Feb 04 PHP
for循环连续求和、九九乘法表代码
Feb 20 PHP
LotusPhp笔记之:Cookie组件的使用详解
May 06 PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
PHP缓冲区用法总结
Feb 14 PHP
PHP浮点比较大小的方法
Feb 14 PHP
Thinkphp实现站点静态化的方法详解
Mar 21 PHP
用PHP的反射实现委托模式的讲解
Mar 22 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
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP getName()函数讲解
2019/02/03 PHP
JS获取后台Cookies值的小例子
2013/03/04 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
如何高效率去掉js数组中的重复项
2016/04/12 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
使用百度地图实现地图网格的示例
2018/02/06 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
ES6 十大特性简介
2020/12/09 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
Python unittest模块用法实例分析
2018/05/25 Python
详解Python if-elif-else知识点
2018/06/11 Python
解决pyinstaller 打包exe文件太大,用pipenv 缩小exe的问题
2020/07/13 Python
10个python爬虫入门实例(小结)
2020/11/01 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
CSS3地图动态实例代码(圆圈向外扩散)
2018/06/15 HTML / CSS
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
2014年车间主任工作总结
2014/12/10 职场文书