zoukankan      html  css  js  c++  java
  • mysqli扩展库---事务控制

    1, 有一张银行账号表

    create table account(
        id int primary key,
        balance float
    );
    

    2,现在有一段php程序,要完成把1号10元钱,转到2号账号上

    <?php
    $mysqli = new MySQLi("127.0.0.1","root","123456","test");
    if($mysqli->connect_error){
        die("连接错误".$mysqli->connect_error);
    }
    $sql1 = "update account set balance = balance -2 where id = 1";
    $sql2 ="update account set balance2 = balance + 2 where id = 2";
    $b1 = $mysqli->query($sql1) or die($mysqli->error);
    $b2 = $mysqli->query($sql2) or die($mysqli->error);
    if(!$b1 || !$b2){
        echo "失败!";
    }else{
        echo "成功!";
    }
    $mysqli->close();
    

      从上面代码可知,如果$sql1此时需要一种方法来控制两个sql操作同时成功,同时失败。

    3,事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。

    <?php
    $mysqli = new MySQLi("127.0.0.1","root","123456","test");
    if($mysqli->connect_error){
        die("连接错误".$mysqli->connect_error);
    }
    //将提交设为false,【事务一旦提交就没有机会回滚】
    $mysqli->autocommit(false);
    //设定保存点1
    $sql1 = "update account set balance = balance -2 where id = 1";
    $sql2 ="update account set balance2 = balance + 2 where id = 2";
    $b1 = $mysqli->query($sql1); //每次执行query时候,会设定保存点,此处设定保存点2
    $b2 = $mysqli->query($sql2); //此处设定保存点3
    
    if(!$b1 || !$b2){
        echo "失败!".$mysqli->error;
        $mysqli->rollback(); //如果失败,回滚到保存点1
    }else{
        echo "成功!";
        $mysqli->commit();  //一旦提交,没有机会回滚
    }
    $mysqli->close();
    

    4,在mysql控制台可以使用事务来操作,具体步骤如下:

    ① 开启一个事务,start transaction。

    ② 做保存点,如果不做,在开启事务时候,默认做一个保存点。savepoint 保存点名称。

    ③ sql操作。

    ④ 可以回滚,可以提交。如果没有问题就提交commit;如果觉得有问题就回滚,rollback  to 某个保存点;一旦提交,就没法回滚。

    5,事务的四大特点acid

    ① 原子性(Atomicity),原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

    ② 一致性(Consistency),事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

    ③ 隔离性(IsoIation),事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

    ④ 持久性(Durability),持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

  • 相关阅读:
    ArrayList源码剖析
    Qt线程外使用Sleep
    malloc、calloc和realloc比较
    C++各大名库
    Qt 编译boost
    VC++ 设置控件显示文本的前景色、背景色以及字体
    std::map的操作:插入、修改、删除和遍历
    time.h文件中包含的几个函数使用时须注意事项
    赋值操作符和拷贝构造函数
    virtual析构函数的作用
  • 原文地址:https://www.cnblogs.com/usa007lhy/p/4933781.html
Copyright © 2011-2022 走看看