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 相关文章推荐
模仿OSO的论坛(四)
Oct 09 PHP
PHP 根据IP地址控制访问的代码
Apr 22 PHP
深入php list()函数的详解
Jun 05 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
Jun 10 PHP
PHP CURL获取返回值的方法
May 04 PHP
php实现简单文件下载的方法
Jan 30 PHP
php数组去除空值函数分享
Feb 02 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
PHP实现的贪婪算法实例
Oct 17 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 PHP
PHP 文件写入和读取操作实例详解【必看篇】
Nov 04 PHP
PHP执行系统命令函数实例讲解
Mar 03 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
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
Add a Table to a Word Document
2007/06/15 Javascript
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
原生javascript实现的分页插件pagenav
2014/08/28 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
jQuery trigger()方法用法介绍
2015/01/13 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
javascript中call,apply,bind函数用法示例
2016/12/19 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
laydate如何根据开始时间或者结束时间限制范围
2018/11/15 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
python3实现磁盘空间监控
2018/06/21 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
简单了解python数组的基本操作
2019/11/26 Python
Python如何把字典写入到CSV文件的方法示例
2020/08/23 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
消防器材管理制度
2014/01/28 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
公安学专业求职信
2014/07/27 职场文书
个人思想政治总结
2015/03/05 职场文书
中学感恩教育活动总结
2015/05/05 职场文书