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 全文搜索和替换的实现代码
Jul 29 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
Jul 13 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
ThinkPHP跳转页success及error模板实例教程
Jul 17 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 PHP
详解PHP中的8个魔术常量
Jul 06 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编程最快明白》第四讲:日期、表单接收、session、cookie
2010/11/01 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】
2018/11/08 Javascript
js常用正则表达式集锦
2019/05/17 Javascript
[01:42]TI4西雅图DOTA2前线报道 第一顿早饭哦
2014/07/08 DOTA
Python读取网页内容的方法
2015/07/30 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Python使用psutil获取进程信息的例子
2019/12/17 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
Python爬虫:Request Payload和Form Data的简单区别说明
2020/04/30 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
美国在线印刷公司:PsPrint
2017/10/12 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
常用UNIX 命令(Linux的常用命令)
2015/12/26 面试题
Linux机考试题
2015/10/16 面试题
妇产科护士自我鉴定
2013/10/15 职场文书
初一生物教学反思
2014/01/18 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Spring中的@Transactional的工作原理
2022/06/05 Java/Android