PHP 中 PDO 的 MYSQL 事務(wù)處理實(shí)例

事務(wù)處理

事務(wù) (transaction) 是由查詢(xún)和/或更新語(yǔ)句的序列組成。用 begin、start transaction 開(kāi)始事務(wù),rollback 回滾事務(wù),commit 提交事務(wù)。

在開(kāi)始事務(wù)后,可以有若干個(gè) SQL 查詢(xún)或更新語(yǔ)句,每個(gè) SQL 遞交執(zhí)行后,還應(yīng)該有判斷是否正確執(zhí)行的語(yǔ)句,以確定下一步是否回滾,若都被正確執(zhí)行則最后提交事務(wù)。

事務(wù)一旦回滾,數(shù)據(jù)庫(kù)則保持開(kāi)始事務(wù)前狀態(tài)。就好象一個(gè)被編輯的文件不存盤(pán)退出,自然還是保持文件原來(lái)的樣子。

所以,事務(wù)可被視為原子操作,事務(wù)中的 SQL,要么全部執(zhí)行,要不一句都不執(zhí)行。

如果需要一個(gè)事務(wù),則必須用 PDO::beginTransaction() 方法來(lái)啟動(dòng),一旦開(kāi)始了事務(wù),可用 PDO::commit() 或 PDO::rollBack()來(lái)完成,這取決于事務(wù)中的代碼是否運(yùn)行成功。

Tips: MySQL只有 InnoDB 驅(qū)動(dòng)支持事務(wù)處理,默認(rèn) MyIsAM 驅(qū)動(dòng)不支持。

代碼示例

連接數(shù)據(jù)庫(kù):

<?php
try {
    // 數(shù)據(jù)庫(kù) PDO 連接
    $pdo = new \PDO('mysql:host=localhost;dbname=mydb', 'root', 'root', array(PDO::ATTR_PERSISTENT => true));
    // 開(kāi)啟異常處理
    $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
    echo "數(shù)據(jù)庫(kù)連接失?。?.$e->getMessage();
    exit;
}

事務(wù)處理:

在下面例子中,假設(shè)為新員工創(chuàng)建一組條目,分配一個(gè)為 23 的 ID。除了登記資料,還需要記錄工資。

<?php
try {
    // 開(kāi)啟事務(wù)處理
    $pdo->beginTransaction();
    // 執(zhí)行 SQL
    $sql1 = $pdo->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
    if (!$sql1) {
        // 拋出異常
        throw new \PDOException("登記資料失敗");
    }
    $sql2 = $pdo->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())");
    if (!$sql2) {
        // 拋出異常
        throw new \PDOException("記錄工資失敗");
    }
    // 沒(méi)有錯(cuò)誤則提交事務(wù)
    $pdo->commit();
} catch (\PDOException $e) {
    // 遇到錯(cuò)誤則回滾事務(wù)
    $pdo->rollBack();
    echo "Failed: " . $e->getMessage();
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • java事務(wù)的處理 轉(zhuǎn) https://www.cnblogs.com/Bonker/p/5417967.html...
    小小的Jobs閱讀 1,640評(píng)論 0 1
  • pdo類(lèi)PDO是一個(gè)“數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)抽象層”,作用是統(tǒng)一各種數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)接口,與mysql和mysqli的函數(shù)庫(kù)相比,...
    桖辶殤閱讀 983評(píng)論 0 0
  • PDO:php數(shù)據(jù)抽象層操作數(shù)據(jù)庫(kù),簡(jiǎn)單理解就是一個(gè)用于操作數(shù)據(jù)庫(kù)的對(duì)象; pdo原理 PDO主要分為三大類(lèi): P...
    DragonRat閱讀 1,021評(píng)論 0 0
  • 一、事務(wù)概念 事務(wù)是一種機(jī)制、是一種操作序列,它包含了一組數(shù)據(jù)庫(kù)操作命令,這組命令要么全部執(zhí)行,要么全部不執(zhí)行。因...
    清茶了了_閱讀 441評(píng)論 0 1
  • 來(lái)簡(jiǎn)書(shū)一個(gè)多星期了,總是為了每天的日更犯愁,想想每天都寫(xiě)什么東西。昨天晚上和朋友喝酒的時(shí)候就講起了這個(gè)事情。我這個(gè)...
    A楊一飛閱讀 295評(píng)論 0 0

友情鏈接更多精彩內(nèi)容