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文件
Jan 04 PHP
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
php print EOF实现方法
May 21 PHP
php设置session值和cookies的学习示例
Mar 21 PHP
PHP程序员的技术成长规划
Mar 25 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
Jul 18 PHP
php中青蛙跳台阶的问题解决方法
Oct 14 PHP
Laravel手动返回错误码示例
Oct 22 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 PHP
PHP+MySql实现一个简单的留言板
Jul 19 PHP
PHP7 字符串处理机制修改
Mar 09 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
用来解析.htpasswd文件的PHP类
2012/09/05 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
JavaScript对象数组排序函数及六个用法
2015/12/23 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
AngularJS2 与 D3.js集成实现自定义可视化的方法
2017/12/01 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
用Python实现KNN分类算法
2017/12/22 Python
解决python3捕获cx_oracle抛出的异常错误问题
2018/10/18 Python
python简单实现AES加密和解密
2019/03/28 Python
Python实现字符串匹配的KMP算法
2019/04/04 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
大学生活学习的自我评价
2013/12/03 职场文书
公司投资建议书
2014/05/16 职场文书
保护黄河倡议书
2014/05/16 职场文书
工作时间证明
2015/06/15 职场文书
2015年文秘个人工作总结
2015/10/14 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
SQLServer常见数学函数梳理总结
2022/08/05 MySQL