Db::startTrans(); //啓動事務
try {
這裏寫SQL語句
Db::commit(); //提交事務
} catch (\PDOException $e) {
Db::rollback(); //回滾事務
}
mysql事務隔離級別有四個
1.讀未提交,有兩個事務:事務A與事務B,事務A裏面更新了一條記錄並且未提交,事務B可以讀取到事務A未提交的更改,一般不用,如果事務B使用了事務A未提交的更改,並在此基礎上做了運算,並更改了數據庫,事務A如果事務回滾,將會導致數據的不一致(存在髒讀問題)。
2.讀提交,這是很多數據庫默認的事務隔離級別,但是不是mysql事務的默認隔離級別,這種隔離級別可以解決髒讀的問題,但是無法解決可重複讀以及幻讀問題,兩個事務:事務A與事務B,事務A更新了某條記錄並提交,事務B在事務A操作該數據之前讀取一次數據,然後在事務A更新該數據並提交後再讀一次,讀到的結果不一樣(也稱不可重複讀)。
3.可重複讀,兩個事務:事務A與事務B,事務A更新了某條記錄並提交,事務B在事務A操作該數據之前讀取一次數據,然後在事務A更新該數據並提交後再讀一次,讀到的結果一樣。針對這種隔離級別,網上很多資料都說存在幻讀的情況,其他數據庫可能如此,但是mysql的innodb存儲引擎卻通過多版本併發控制解決了幻讀這個問題,筆者在實際測試過程中發現如果事務A插入或者刪除數據,事務B僅僅執行select操作,不執行insert、update等更改數據的操作,那麼就不存在幻讀的問題,否則就會存在幻讀問題,但是筆者認爲這也不是典型的幻讀操作了吧,畢竟執行了write操作
4.串行讀,最高的事務隔離級別,在實際生產環境很少使用,因爲這種隔離級別應對高併發方面性能遠遠不足!!