PHP中使用PDO操作事務的一些小測試

2021-10-13 15:25:13 字數 1185 閱讀 3851

首先,相信只要是學過一點點的 mysql 相關知識的人都知道,在 mysql 中常用的兩種表型別就是 innodb 和 myisam 這兩種型別。當然,我們今天也不講它們全部的區別,但有乙個區別是最明顯的,那就是 myisam 不支援事務。那麼,如果我們在 pdo 操作中對 myisam 進行事務操作會怎麼樣呢?

// myisam

try  catch (exception $e)

tran_myisam 和 tran_myisam2 表都是 myisam 型別的表,在這段**中,我們故意寫錯了 tran_myisam2 的插入語句,讓它走到 catch 中。實際執行的結果是,報錯資訊正常輸出,tran_myisam 表的資料也被插入了。也就是說,針對 myisam 表的事務操作是沒有效果的。當然,pdo 也不會主動報錯,如果我們讓第二條 sql 語句也是正常語句的話,pdo 只會正常執行結束,不會有任何的錯誤或者提示資訊。

// innodb

try  catch (exception $e)

我們可以開啟 sleep(30); 這行**的注釋,也就是在事務提交前暫停 30 秒,然後在 mysql 中檢視 infomation_schema.innodb_trx 表。這個表中顯示的就是正在執行中的事務。在 innodb 型別的表執行時就可以看到一條事務正在執行的記錄,而 myisam 型別的表中則不會看到任何資訊。

假設我們忘寫了 commit() ,同時也沒有報錯,這條語句會執行成功嗎?就像下面這段**一樣。

try  catch (exception $e)
php 會在指令碼執行結束後,其實也就是在 $pdo 物件析構時回滾這個事務。也就是說,這裡的 sql 語句是不會執行的。但是,盡量不要這麼做,因為在正式環境中,我們的**非常複雜,而且不一定會析構成功。這樣的話,可能會有長時間佔據的事務存在,最終結果就是會導致 mysql 的 ipqs 奇高,而且還很難找到原因。所以,在使用事務的時候,一定要記得 commit() 和 rollback() 都是我們的親兄弟,絕不能落下他們。

// innodb

try  catch (exception $e) 

// innodb

try  catch (exception $e)

測試**:

中使用pdo操作事務的一些小測試.php

PHP學習 pdo的插入操作和事務操作

trycatch pdoexception e 執行sql語句 exec query prepare 一是有結果集的query 執行select語句 exec 用來執行有影響行數的,update,delete insert,other exec 返回的是影響的行數 affected rows pdo...

使用PHP的PDO類操作MySQL

mysql new pdo mysql host localhost sort 3306 dbname foo user,psd 值得一提的是,如果連線資料庫失敗,會丟擲乙個pdoexception異常,這樣我們就可以直接用try catch 來處理異常,不僅如此,還可以通過pdo setattri...

PHP的PDO基本操作

php 5 及以上版本建議使用以下方式連線 mysql mysqli extension i 意為 improved pdo php data objects pdo 應用在 12 種不同資料庫中,mysqli 只針對 mysql 資料庫。二者都支援預處理語句,可防止sql注入。示例 servern...