php利用事务处理转账问题


Posted in PHP onApril 22, 2015

本文实例讲述了php+Mysqli利用事务处理转账问题的方法。分享给大家供大家参考

<?php 
 header("Content-type:text/html; charset=utf-8"); 
  
 $mysqli = new mysqli("localhost", "root", "064319", "php"); 
 $mysqli->set_charset("utf8"); 
  
 if($mysqli->connect_errno) { 
  die('数据库连接失败'.$mysqli->connect_error); 
 } 
  
 $mysqli->autocommit(false); //自动提交模式设为false 
 $flag = true; //事务是否成功执行的标志 
  
 $query = "update account set balance=balance-1000 where id=3"; 
 $result = $mysqli->query($query); 
 $affected_count = $mysqli->affected_rows; 
 if(!result || $affected_count == 0) { //失败 
  $flag = false;  
 } 
  
 $query = "update account set balance=balance+1000 where id=2"; 
 $result = $mysqli->query($query); 
 $affected_count = $mysqli->affected_rows; 
 if(!$result || $affected_count == 0) { 
  $flag = false; 
 } 
  
 if($flag) { 
  $mysqli->commit(); 
  echo '转账成功'; 
 } else { 
  $mysqli->rollback(); 
  echo '转账失败'; 
 } 
  
 $mysqli->autocommit(true); //重新设置事务为自动提交 
 $mysqli->close(); 
?>

代码二:

<?php 
 try{ 
 $pdo=new PDO("mysql:host=localhost;dbname=psp","root",""); 
 $pdo->exec("set names utf8"); 
 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);//设置异常处理模式 
 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0);//关闭自动提交 
 }catch(PDOException $e){ 
 echo "数据库连接失败"; 
 exit; 
 } 
 
 try{ 
 $age=10; 
 $pdo->beginTransaction();//开始事务 
 $affected_rows1=$pdo->exec("update kfry set k_age=k_age+{$age} where k_name='user1'"); 
 $affected_rows2=$pdo->exec("update kfry set k_age=k_age-{$age} where k_name='user2'");//随意更改使之执行成功或失败 
 /* if($affected_rows1&&$affected_rows2) 
 { 
 $pdo->commit(); 
 echo "操作成功"; 
 }else{ 
 $pdo->rollback(); 
 } */
 if(!$affected_rows1) 
 throw new PDOException("加入错误"); 
 if(!$affected_rows2) 
 throw new PDOException("减少错误"); 
 echo "操作成功"; 
 $pdo->commit();//如果执行到此处前面两个更新sql语句执行成功,整个事务执行成功 
 }catch(PDOException $e){ 
 echo "操作失败:".$e->getMessage(); 
 $pdo->rollback();//执行事务中的语句出了问题,整个事务全部撤销 
 } 
 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1); 
 //测试是否成功 
 echo "\n操作结果为:\n"; 
 $sql="select * from kfry"; 
 $result=$pdo->query($sql); 
 foreach($result as $v) 
 { 
 echo $v['k_name']." ".$v['k_age']."\n"; 
 } 
?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
帖几个PHP的无限分类实现想法~
Jan 02 PHP
php 禁止页面缓存输出
Jan 07 PHP
php HandlerSocket的使用
May 02 PHP
MySQL时间字段究竟使用INT还是DateTime的说明
Feb 27 PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
PHP递归创建多级目录
Nov 05 PHP
thinkphp框架下实现登录、注册、找回密码功能
Apr 06 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
Feb 11 PHP
一次因composer错误使用引发的问题与解决
Mar 06 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 PHP
详解Laravel制作API接口
May 31 PHP
ThinkPHP文件缓存类代码分享
Apr 22 #PHP
php文件下载处理方法分析
Apr 22 #PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 #PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 #PHP
php文件缓存类用法实例分析
Apr 22 #PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 #PHP
PHP判断是否为空的几个函数对比
Apr 21 #PHP
You might like
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
ajax 的post方法实例(带循环)
2011/07/04 PHP
php实现的验证码文件类实例
2015/06/18 PHP
php实现上传图片文件代码
2015/07/19 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
php微信开发之图片回复功能
2018/06/14 PHP
php集成开发环境详解
2019/09/24 PHP
js实现可拖动DIV的方法
2013/12/17 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
使用script的src实现跨域和类似ajax效果
2014/11/10 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
浅谈JavaScript作用域和闭包
2017/09/18 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
2017/11/23 Javascript
python中mechanize库的简单使用示例
2014/01/10 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
Python的pycurl包用法简介
2015/11/13 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
Python3实现转换Image图片格式
2018/06/21 Python
浅析python参数的知识点
2018/12/10 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
渗透攻击的测试步骤
2014/06/07 面试题
公司人力资源的自我评价
2014/01/02 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
商超业务员岗位职责
2015/02/13 职场文书
安全温馨提示语大全
2015/07/14 职场文书
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python