MySQL PDO 事务处理

x33g5p2x  于2021-03-14 发布在 Mysql  
字(1.4k)|赞(0)|评价(0)|浏览(450)

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();
}

相关文章

微信公众号

最新文章

更多