PDO 事务处理
PDO 事务对象方法
方法描述beginTransaction()启动一个事务
commit()提交一个事务
rollBack()回滚一个事务
inTransaction()检测是否在一个事务内
注意:当需要使用事务的时候,数据库表引擎不能是 MyISAM ,必须要是 InnoDB。
try {
$host = 'mysql:host=localhost;dbname=test';
$pdo = new PDO($host, 'root', 'aaaaaa', [PDO::ATTR_AUTOCOMMIT => 0]);
// 建表 SQL
$sql = <<
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();
}