zoukankan      html  css  js  c++  java
  • php 事务处理transaction

    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

    • 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务

    • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行

    • 事务用来管理insert,update,delete语句

    一般来说,事务是必须满足4个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(持久性)

    • 1、事务的原子性:一组事务,要么成功;要么撤回。

    • 2、稳定性 : 有非法数据(外键约束之类),事务撤回。

    • 3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。

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

    执行下面的程序

    $mysqli = new mysqli('localhost','root','mayi1991','mysqldemo');
    if($mysqli->connect_error){
        die('数据库连接错误'.$mysqli->connect_error);
    }
    
    $sql1 = "update account set balance = balance - 2 where id = 1";
    //这里故意写错指令中的balance1属性
    $sql2 = "update account set balance1 = balance + 2 where id = 2";        
    $result1 = $mysqli->query($sql1);
    $result2 = $mysqli->query($sql2);
    
    if(!$result1 || !$result2){
        die('操作错误'.$mysqli->error);
    }else{
        die('操作成功');
    }
    $mysqli->close();

    虽然上面的代码有报错,但是在数据库中,id=1的balance已经改变;这样就会出现问题;

    我们要的同时改变,如果有一个出错,就不改变;这个时候,我们就需要“事务控制”来保证“一致性”;

    我们需要用到的方法autocommit()  commit();看下面的代码

    $mysqli = new mysqli('localhost','root','mayi1991','mysqldemo');
    if($mysqli->connect_error){
        die('数据库连接错误'.$mysqli->connect_error);
    }
    
    //关闭数据库自动提交
    $mysqli->autocommit(false);
    
    $sql1 = "update account set balance = balance - 2 where id = 1";
    //这里故意写错属性balance1
    $sql2 = "update account set balance1 = balance + 2 where id = 2";
    $result1 = $mysqli->query($sql1);
    $result2 = $mysqli->query($sql2);
    
    if(!$result1 || !$result2){
        die('操作错误'.$mysqli->error);
        $mysqli->rollback();    //事务回退
    }else{
        //操作全部正确后再提交
        $mysqli->commit();
    }
    $mysqli->close();

    首先利用autocommit(false)方法,关闭数据库自动提交,然后当操作语句全部成功后,commit()提交到数据库;

    如果操作失败,我们用rollback()方法回退。

  • 相关阅读:
    2020年. NET Core面试题
    java Context namespace element 'component-scan' and its parser class ComponentScanBeanDefinitionParser are only available on JDK 1.5 and higher 解决方法
    vue 淡入淡出组件
    java http的get、post、post json参数的方法
    vue 父子组件通讯案例
    Vue 生产环境解决跨域问题
    npm run ERR! code ELIFECYCLE
    Android Studio 生成apk 出现 :error_prone_annotations.jar (com.google.errorprone:error) 错误
    记忆解析者芜青【总集】
    LwIP应用开发笔记之十:LwIP带操作系统基本移植
  • 原文地址:https://www.cnblogs.com/minigrasshopper/p/7803938.html
Copyright © 2011-2022 走看看