PHP基础 mysqli的事务处理

时间:2023-01-19 20:20:20
   1: <?php

   2: //                PHP 的mysqli的事务处理

   3: //========================================================

   4: //执行多条sql语句,如果都成功则提交事务,如果一个执行失败则回滚事务

   5: //把多条sql语句的执行看成一个sql语句,要么都成功,要么都失败

   6: //例:银行转账

   7: //mysql4.0以上版本都启用了事务

   8: //但目前只有InnoDB和BDB两种表类型支持事务,

   9: //在命令行中:默认创建的表类型为MyISAM表类型,是不支持事务的

  10: //在命令行中建表时添加 type=InnoDB ,默认自动提交事务autocommit,不能回滚

  11: //手动提交:

  12: //1.关闭自动提交 set autocommit=0;

  13: //2.开启事务 start transaction (mysqli中不需要开启,自动开启)

  14: //3.$mysqli->query($sql); 执行sql

  15: //4.判断执行是否成功

  16: //5.如果都成功,则提交事务commit(),否则回滚事务 rollback()

  17:  

  18: //创建连接对象

  19: $mysqli = new mysqli("localhost","root","1234","BankDB");

  20:  

  21: if($error=$mysqli->connect_error){

  22:     die("连接数据库失败:".$error);

  23: }

  24:  

  25: //设置传输字符编码

  26: $mysqli->query('set names utf8');

  27: // 或者

  28: // $mysqli->set_charset("uf8");

  29:  

  30: //关闭自动提交事务

  31: $mysqli->autocommit(false);

  32:  

  33: $error=true;

  34:  

  35: $price=50;

  36:  

  37: $sql1= "update uinfo set umoney=umoney-{$price} where uname='张三';";

  38: $sql2= "update uinfo set umoney=umoney+{$price} where uname='李四';";

  39:  

  40: //执行sql语句

  41: $result1 = $mysqli->query($sql1);

  42: if(!$result1) {

  43:     $error=false;

  44:     echo "从张三转出失败!\n";

  45: }

  46: else if($mysqli->affected_rows==0)

  47: {

  48:     $error=false;

  49:     echo "张三的钱没有变化!\n";

  50: }

  51:  

  52: //执行sql语句

  53: $result2 = $mysqli->query($sql2);

  54: if(!$result2){

  55:     $error=false;

  56:     echo "转入李四失败\n";

  57: } 

  58: else if($mysqli->affected_rows==0)

  59: {

  60:     $error=false;

  61:     echo "李四的钱没有变化!\n";

  62: }

  63:  

  64: //判断执行过程是否出错,如果语句都执行成功则提交事务,否则回滚事务

  65: if ($error) {

  66:     $mysqli->commit();

  67:     echo "事务提交,转账成功!";

  68: } else {

  69:     $mysqli->rollback();

  70:     echo "事务回滚,转账失败!";

  71: }

  72:  

  73: //打开自动提交事务

  74: $mysqli->autocommit(true);

  75:  

  76: $mysqli->close();

  77: ?>