PHP MySQL (三)面向对象 事务

事务

特性:(ACID)

原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

使用场景简易说明:A账户给B账户转账100大洋

正常情况下,A账户减少100大洋,B账户增加100大洋。
不正常情况下,A账户减少了100大洋,系统故障,B账户没有增加100大洋。
不正常情况下,A账户没有减少100大洋,而B账户增加了100大洋。

如何解决数据一致性的问题,使用事务机制就能够保证数据的一致性

简易示例
<?php
    //mysql事务
    header('content-type:text/html;charset=utf-8');

    $host = '127.0.0.1';
    $user = 'root';
    $password = 'root';
    $db = 'test';
    $mysqli = new mysqli($host, $user, $password, $db);

    if($mysqli->connect_errno){
        die($mysqli->connect_error);
    }
    $mysqli->set_charset('utf8');
    //先关闭自动提交功能
    $mysqli->autocommit(FALSE);
    $sql1 = "UPDATE `account` set `money` = `money` - 200 WHERE `id` = ?";
    $mysqli_stmt1 = $mysqli->prepare($sql1);//准备预处理语句
    //i代表int
    $mysqli_stmt1->bind_param('i',$id1);
    if($mysqli_stmt1->execute()) {
        if($mysqli_stmt1->num_rows > 0){
            echo '更改成功';
        }else{
            echo '更改失败';
        }
    }

    $sql2 = "UPDATE `account` set `money` = `money` + 200 WHERE `id` = ?";
    $mysqli_stmt2 = $mysqli->prepare($sql2);//准备预处理语句
    //i代表int
    $mysqli_stmt2->bind_param('i',$id2);
    if($mysqli_stmt2->execute()) {
        if($mysqli_stmt2->num_rows > 0){
            echo '更改成功';
        }else{
            echo '更改失败';
        }
    }

    if($mysqli_stmt1->num_rows > 0 && $mysqli_stmt2->num_rows > 0){
        $mysqli->commit();
        $mysqli->autocommit(true);
        echo '转账成功';
    }else{
        $mysqli->rollback();
        echo '转账失败';
    }
    $mysqli_stmt->close();
    $mysqli->close();
本作品采用《CC 协议》,转载必须注明作者和本文链接
写的不好,就当是整理下思绪吧。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!