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桌面中心(三) 修改数据库
Mar 11 PHP
PHP函数常用用法小结
Feb 08 PHP
PHP 命名空间实例说明
Jan 27 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
Oct 23 PHP
PHP数据过滤的方法
Oct 30 PHP
php按百分比生成缩略图的代码分享
May 10 PHP
php pthreads多线程的安装与使用
Jan 19 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
May 04 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
May 27 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 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文件怎么打开 如何执行php文件
2011/12/21 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
javascript按位非运算符的使用方法
2013/11/14 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
详解用python生成随机数的几种方法
2019/08/04 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
python小白切忌乱用表达式
2020/05/29 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
蒙蒂塞罗商店:Monticello Shop
2018/11/25 全球购物
联谊会主持词
2014/03/26 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
商业用房租赁协议书
2014/10/13 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
技能培训通讯稿
2015/07/18 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis