PHP PDO操作mysql事務

2021-07-30 15:41:17 字數 1796 閱讀 6090

mysql事務是把幾個操作綁在一起,使他們同時一起完成或者同時全部不執行。資料更新往往牽涉多個表,使用普通更新,如果中間出現差錯(比如,伺服器突然停止執行了),則更新後的結果非常難辦。如果一點都沒更新,可以執行程式,重新來過;但部分更新,就要挨個 人工  去查;如果資料量非常大,再人工去查,不僅耗費人力資源,還特別費時間,而收益非常小

在這裡介紹php pdo操作mysql事務:

1、mysql的預設引擎為myisam,不支援事務,因此要修改(這裡是修改預設引擎的方法,當然也有其他方法): my.ini檔案的最低端:[mysqld]    新增**:  init_connect='set autocommit=0'

default-storage-engine=innodb  

然後重新啟動資料庫伺服器,並在查詢出執行 :alter table ac engine=innodb; (即便預設引擎更改了,但當前資料表的引擎還是myisam)

3、php檔案:

<?php

header("content-type:text/html;charset=utf-8");

//設定列印輸出的格式(text/html,html格式;text/xml,xml格式)及編碼方式

$options=array(pdo::mysql_attr_init_command=>"set names 'utf8'");

//防止從資料庫裡輸出中文亂碼

trycatch(pdoexception $e)

$pdo->setattribute(pdo::attr_autocommit,0);

//是否自動提交(0,等待commit命令提交;1,當場就提交),為事務做準備;

try where us=1 ";

$affected_rows=$pdo->exec($sql);

if(!$affected_rows)

throw new pdoexception("張三轉出失敗");

if($p1

//先扣帳,後比較餘額是否足夠(正常情況下應該先比較餘額是否足夠,再扣賬)

//$sql="update accounts set balance=balance+ where username=13";

$sql="update ac set ba=ba+ where us1=2";//錯誤的sql語句,表項user1不存在

$affected_rows=$pdo->exec($sql);

if(!$affected_rows)

throw new pdoexception("向李四轉入失敗");

echo "交易成功!";

$pdo->commit();//事務成功,資料提交儲存

}catch(pdoexception $e)//出現異常,事務停止(後面的停止了,但前面的已經執行了,因此需要回撤)

$pdo->setattribute(pdo::attr_autocommit,1);//事務結束,設定自動提交(之後其他的操作,比如select,需要自動提交)

$sqlx="select * from ac";

$info=$pdo->query($sqlx)->fetchall(pdo::fetch_assoc);

var_dump($info);

事務的關鍵在於,無論在任何地方出現異常,所有的操作都要取消(關鍵要回撤已經執行的操作)。即便是先扣賬,再把扣賬之前的餘額資料拿來對比,不足以支付,也能回撤已經扣掉的帳。因此要使事務成功,除非避開所有異常,否則就是一點都沒做。

PHP PDO事務回滾

trycatch pdoexception e 事務處理 try where id 1 affected rows pdo exec sql if affected rows throw new pdoexception 張三轉出失敗 那個錯誤丟擲異常 sql update zhanghao set...

PHP PDO操作MySQL基礎教程

php中的pdo擴充套件為php訪問資料庫定義了乙個輕量級的 一致性的介面,它提供了乙個資料訪問抽象層,www.cppcns.com這樣,無論使用什麼資料庫,都可以通過一致的函式執行查詢和獲取資料。pdo支援的php版本為php5.1以及更高的版本,而且在php5.2下pdo預設為開啟狀態,下面是在...

PHP PDO簡單操作

pdo php data object,php資料物件 是一種純物件導向的操作風格,在新版的php中,php封裝了一套pdo擴充套件庫,專門用來操作不同型別的資料庫!作用 由於資料庫的差異性,各個資料庫的呼叫不是完全相同的,同樣的程式如果使用不同的資料庫存放資料時,需要對程式的資料處理部分進行改動,...