mysql中關於事務

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.串行讀,最高的事務隔離級別,在實際生產環境很少使用,因爲這種隔離級別應對高併發方面性能遠遠不足!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章