• 事务控制


    • 案例——银行转账

    1、先建表account

    create table account(
    id int primary key auto_increment,
    balance float
    );
    insert into account (balance) values (35);
    insert into account (balance) values (100);
    insert into account (balance) values (200);

    2、假设从账户1向账户2转钱

    $sql1="update account set balance=balance-10 where id=1";
    $sql2="update account set balance=balance+10 where id=2";

    如果sql语句1执行成功,2失败,则钱就会凭空消失,这是不允许的。

    所以,我们需要有一种方法来控制两个sql语句同时成功,或同时失败——事务!

    3、事务

    事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么

    全部成功,要么全部失败。如网上转账就是典型的要用事务控制的事件。使用时:

    若该组dml语句都成功,则提交事务;

    若没有全部成功,则回滚,就是把执行过的sql语句再复原。

    4、事务回滚的使用

     1 <?php
     2     //事务
     3     $mysqli=new MySQLi("localhost","root","root","test");
     4     if($mysqli->connect_error){
     5         die("连接数据库失败".$mysqli->connect_error);
     6     }
     7     //将自动提交设为false
     8     $mysqli->autocommit(false);
     9     $sql1="update account set balance=balance-10 where id=1";
    10     $sql2="update account set balance=balance+10 where id=2";
    11     $res1=$mysqli->query($sql1);
    12     $res2=$mysqli->query($sql2);
    13     if(!$res1||!$res2){
    14         echo "失败,回滚";
    15         //回滚
    16         $mysqli->rollback();
    17     }else{
    18         //成功,则提交事务
    19         $mysqli->commit();
    20     }
    21     $mysqli->close();
    22 ?>

    结果如下:

    • mysql控制台中事务的操作

    目标:从账户3向账户1转25块

    1、开启一个事务 start transaction;

    2、做保存点a   savepoint a;

    账户3减25块    update account set balance=balance-25 where id=3;

    3、做保存点b    savepoint b;

     

    4、假设这里出错:账户1加20块(少了5块) update account set balance=balance+20 where id=1;

     

    5、这时我们就得回滚到保存点 a    rollback to a;

    注意:当回滚到保存点a 后,保存点b 就自动被冲掉了

    6、如果步骤4没有出错,账户1增加25块,即账户3成功向账户1转账25块,则提交事务   commit;

    注意:事务一旦提交,就不能再回滚!!!

  • 相关阅读:
    第十章 迭代器模式 Iterator
    第四章:使用Proxy代理让客户端服务端分工合作。
    第三章:真正弄清楚一个Mod的组织结构
    第二章:开始开发mod前你需要知道的一些事情
    第一章:在IDEA里搭建基于Forge的Minecraft mod开发环境
    Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。
    关于坑爹的PopupWindow的“阻塞”争议问题:Android没有真正的“阻塞式”对话框
    快排-Go版本
    链表翻转(按K个一组)(Go语言)
    牛客刷题-重建二叉树(GO语言版)
  • 原文地址:https://www.cnblogs.com/seaBiscuit0922/p/5920714.html
Copyright © 2020-2023  润新知