PHP MySQL (三)物件導向 事務

一句話兒發表於2020-01-31

特性:(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 協議》,轉載必須註明作者和本文連結
寫的不好,就當是整理下思緒吧。

相關文章