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生成网页快照 不用COM不用扩展.
Feb 11 PHP
简单谈谈php中ob_flush和flush的区别
Nov 27 PHP
PHP中调用SVN命令更新网站方法
Jan 07 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
[原创]php使用curl判断网页404(不存在)的方法
Jun 23 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 PHP
php文件管理基本功能简单操作
Jan 16 PHP
php获取excel文件数据
Apr 21 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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 数组基本操作小结(推荐)
2016/06/13 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
js控制框架刷新
2008/08/01 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
JS定义网页表单提交(submit)的方法
2015/03/20 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
2017/08/15 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
vue实现文件上传功能
2018/08/13 Javascript
vue解决一个方法同时发送多个请求的问题
2018/09/25 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
JS实现小星星特效
2019/12/24 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
python中MySQLdb模块用法实例
2014/11/10 Python
Python Sleep休眠函数使用简单实例
2015/02/02 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
基于python历史天气采集的分析
2019/02/14 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
python tkinter控件布局项目实例
2019/11/04 Python
Python with语句和过程抽取思想
2019/12/23 Python
linux 下selenium chrome使用详解
2020/04/02 Python
巴西宠物商店:Cobasi
2019/04/19 全球购物
电气工程及其自动化自我评价四篇
2013/09/24 职场文书
外贸专业求职信
2014/03/09 职场文书
英语复习计划
2015/01/19 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL