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 相关文章推荐
如何给phpadmin一个保护
Oct 09 PHP
php header()函数使用说明
Jul 10 PHP
php 数组的一个悲剧?
May 11 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
PHP URL路由类实例
Nov 12 PHP
微信支付开发教程(一)微信支付URL配置
May 28 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
Jul 24 PHP
php文件读取方法实例分析
Jun 20 PHP
php实现对象克隆的方法
Jun 20 PHP
php实现的二分查找算法示例
Jun 20 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 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实现Soap通讯的方法
2014/11/03 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
Element Dropdown下拉菜单的使用方法
2020/07/26 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
Python中编写ORM框架的入门指引
2015/04/29 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
Python自定义线程类简单示例
2018/03/23 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
python两个_多个字典合并相加的实例代码
2019/12/26 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
文明班级申报材料
2014/12/24 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB