php利用事务处理转账问题

5年以前  |  阅读数:283 次  |  编程语言:PHP 

本文实例讲述了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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
将二进制数据转为16进制以便显示
获取IMSI
获取IMEI
Java生成UUID
PHP自定义函数获取搜索引擎来源关键字的方法
让你成为最历害的git提交人
在Zeus Web Server中安装PHP语言支持
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Yii2汉字转拼音类的实例代码
Python 2与Python 3版本和编码的对比
php+ajax+json 详解及实例代码
php封装的page分页类完整实例
PHP设计模式之工厂模式与单例模式
php数组合并array_merge()函数使用注意事项
PHP实现简单爬虫的方法
php实现数组中索引关联数据转换成json对象的方法
wget使用技巧