characters

PDO 事务处理

PDO 事务对象方法

方法描述
beginTransaction()启动一个事务
commit()提交一个事务
rollBack()回滚一个事务
inTransaction()检测是否在一个事务内

注意:当需要使用事务的时候,数据库表引擎不能是 MyISAM ,必须要是 InnoDB

<?php

try {
    $host = 'mysql:host=localhost;dbname=test';
    $pdo = new PDO($host, 'root', 'aaaaaa', [PDO::ATTR_AUTOCOMMIT => 0]);
    // 建表 SQL
    $sql = <<<EOF
        CREATE TABLE IF NOT EXISTS user_account(
            id INT UNSIGNED NOT NULL AUTO_INCREMENT,
            username VARCHAR(20) NOT NULL UNIQUE,
            money DECIMAL(8,2) NOT NULL, 
            PRIMARY KEY (id)
        )ENGINE=InnoDB DEFAULT CHARSET UTF8 COMMENT "用户账户表";
EOF;
    $pdo->exec($sql); // 使用 PDO 对象的 exec()方法执行建表语句
    /*$sql = 'INSERT INTO user_account (username, money) VALUES (:username, :money),(:username2, :money2)';
    $statement = $pdo->prepare($sql); // 预处理 SQL
    $statement->bindParam(':username', $username, PDO::PARAM_STR);
    $statement->bindParam(':money', $money);
    $statement->bindParam(':username2', $username2, PDO::PARAM_STR);
    $statement->bindParam(':money2', $money2);
    $username = 'luo';
    $money = 3000.00;
    $username2 = 'li';
    $money2 = 3000.00;
    $statement->execute(); // 执行预处理*/
    // 开启事务
    $pdo->beginTransaction();
    $res = $pdo->exec('UPDATE user_account SET money = money - 2000 WHERE username = "li"');
    if ($res == 0) {
        throw new PDOException('li 转账失败');
    }
    $res2 = $pdo->exec('UPDATE user_account SET money = money + 2000 WHERE username = "luo"');
    if ($res2 == 0) {
        throw new PDOException('luo 接受转账失败');
    }
    $pdo->commit();
} catch (PDOException $e) {
    echo $e->getMessage();
}


Previous article: Next article: