?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
PDO 事務(wù)對(duì)象方法
方法 | 描述 |
---|---|
beginTransaction() | 啟動(dòng)一個(gè)事務(wù) |
commit() | 提交一個(gè)事務(wù) |
rollBack() | 回滾一個(gè)事務(wù) |
inTransaction() | 檢測(cè)是否在一個(gè)事務(wù)內(nèi) |
注意:當(dāng)需要使用事務(wù)的時(shí)候,數(shù)據(jù)庫(kù)表引擎不能是
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 "用戶(hù)賬戶(hù)表"; EOF; $pdo->exec($sql); // 使用 PDO 對(duì)象的 exec()方法執(zhí)行建表語(yǔ)句 /*$sql = 'INSERT INTO user_account (username, money) VALUES (:username, :money),(:username2, :money2)'; $statement = $pdo->prepare($sql); // 預(yù)處理 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(); // 執(zhí)行預(yù)處理*/ // 開(kāi)啟事務(wù) $pdo->beginTransaction(); $res = $pdo->exec('UPDATE user_account SET money = money - 2000 WHERE username = "li"'); if ($res == 0) { throw new PDOException('li 轉(zhuǎn)賬失敗'); } $res2 = $pdo->exec('UPDATE user_account SET money = money + 2000 WHERE username = "luo"'); if ($res2 == 0) { throw new PDOException('luo 接受轉(zhuǎn)賬失敗'); } $pdo->commit(); } catch (PDOException $e) { echo $e->getMessage(); }