1. 程式人生 > >PDO中的事務處理

PDO中的事務處理

ech cti dbm 開始 on() exec image 相關 use

基本原理和步驟其實都是一樣的(可參看上一篇“MySQL的事務處理”),PDO中的事務處理就是調用PDO對象的三個方法:

開啟事務:beginTransaction

回滾操作:rollBack

執行操作:commit

事務處理最典型的就是借還錢。下面以張三向李四還1000元為例

首先看一下數據庫中各自的錢數

技術分享

下面是利用PDO處理還錢事務的代碼:

<?php 

/**
* 利用PDO對象實現事物操作
*/

echo "<meta charset=utf-8>";

//PDO類的實例化

// 1 設置數據源相關參數
$dbms = ‘mysql‘;    //選擇數據庫類型
$host = ‘localhost‘;
$port = ‘3306‘; $dbname = ‘test‘; $charset = ‘utf8‘; $dsn = "$dbms:host=$host;port=$port;dbname=$dbname;charset=$charset"; // 2 設置用戶名密碼 $user = ‘root‘; $pwd = ‘‘; // 3 實例化PDO類 $pdo = new PDO($dsn,$user,$pwd); // 4 PDO事務物操作 // 4.1 開啟事務 $pdo->beginTransaction(); //設置一個變量,用來判斷所有sql語句是否成功 $flag = true; // 4.2 執行事務中的一組sql語句
$sql = "update pdo set money=money+1000 where name=‘李四‘"; $res = $pdo->exec($sql); if (!$res) { //如果sql語句執行失敗,把$flag設置為false; $flag=false; } $sql = "update pdo set money=money-1000 where name=‘張三‘"; $res = $pdo->exec($sql); if (!$res) { //如果sql語句執行失敗,把$flag設置為false; $flag=false; } // 4.3 判斷事務是否執行成功
if ($flag) { //所有sql語句執行成功,把sql語句提交 $pdo->commit(); echo "還錢成功!"; }else{ // 如其中一條執行失敗,則回滾到事務開啟之前的狀態 $pdo->rollback(); echo "還錢失敗!"; }

結果:

技術分享

技術分享

下面,我們故意把其中一個字段寫錯,看看事務是否正常處理,數據庫中的錢數是否有變化!

// 4.2 執行事務中的一組sql語句
$sql = "update pdo set mone = money+1000 where name=‘李四‘";  //把moeny字段錯寫成mone

結果:

技術分享

技術分享

結果是還錢失敗,並且數據庫中各自的錢數沒有變化,說明當某一條語句未執行成功時,事務不會提交,而會回滾,把數據恢復到開始事務之前的原始狀態,這也是使用事務的作用,即只有當事務中所有sql語句全部執行成功,事務才會提交,否則會回滾!

PDO中使用事務和在MySQL中使用事務原理基本一樣!

PDO中的事務處理