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 相关文章推荐
一个简洁的多级别论坛
Oct 09 PHP
来自PHP.NET的入门教程
Oct 09 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
php下检测字符串是否是utf8编码的代码
Jun 28 PHP
解析php类的注册与自动加载
Jul 05 PHP
php实现文件下载(支持中文文名)
Dec 04 PHP
php curl post 时出现的问题解决
Jan 30 PHP
CentOS安装php v8js教程
Feb 26 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
jQuery+php简单实现全选删除的方法
Nov 28 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
Oct 10 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
The specified CGI application misbehaved by not returning a complete set of HTTP headers
2011/03/31 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
Django 中 cookie的使用
2017/08/17 PHP
js 解决“options为空或不是对象”
2008/12/22 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
element中的$confirm的使用
2020/04/26 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python实现的爬虫功能代码
2017/06/24 Python
python通过tcp发送xml报文的方法
2018/12/28 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
python和JavaScript哪个容易上手
2020/06/23 Python
解决python对齐错误的方法
2020/07/16 Python
python lambda的使用详解
2021/02/26 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
小学端午节活动总结
2015/02/11 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
Python使用Kubernetes API访问集群
2021/05/30 Python
python实现会员管理系统
2022/03/18 Python
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang