mysql默認事務

5.6版本之前,mysql的默認引擎是Myisam不支持事務。
5.6版本之後,默認引擎是InnoDB支持事務,有四種隔離級別,未提交讀、已提交讀、可重複讀、串行化,默認可重複讀。

Myisam和Innodb的區別
1.Myisam只支持表級鎖,Innodb支持行級鎖
2.Myisam不支持事務,Innodb支持事務
3.Myisam不支持外鍵,Innodb支持外鍵
4.Myisam支持全文索引,Innodb不支持,5.6後的版本支持
5.Myisam本身存儲了表的總行數,而Innodb沒有,所以查詢總行數Myisam快,有查詢的條件的二者沒什麼區別

如果執行大量的select,insert MyISAM比較適合,如果有大量的update和insert,建議使用InnoDB,特別是針對多個併發和QPS較高的情況。

查詢數據庫使用的事務的sql:
select @@global.tx_isolation;

隔離級別 髒讀(Dirty Read) 不可重複讀(NonRepeatable Read) 幻讀(Phantom Read)
未提交讀(Read uncommitted) 可能 可能 可能
已提交讀(Read committed) 不可能 可能 可能
可重複讀(Repeatable read) 不可 不可 可能
可串行化(Serializable ) 不可能 不可能 不可能

未提交讀(Read Uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的數據
提交讀(Read Committed):只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別 (不重複讀)
可重複讀(Repeated Read):可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀
串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞

可重複讀和幻讀
在可重複讀中,該sql第一次讀取到數據後,就將這些數據加鎖(悲觀鎖),其它事務無法修改這些數據,就可以實現可重複讀了。但這種方法卻無法鎖住insert的數據,所以當事務A先前讀取了數據,或者修改了全部數據,事務B還是可以insert數據提交,這時事務A就會發現莫名其妙多了一條之前沒有的數據,這就是幻讀,不能通過行鎖來避免。需要Serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這麼做可以有效的避免幻讀、不可重複讀、髒讀等問題,但會極大的降低數據庫的併發能力。

MySQL、ORACLE、PostgreSQL等數據庫,出於性能考慮,都是使用了以樂觀鎖爲理論基礎的MVCC(多版本併發控制)來實現。
什麼叫MVCC?下一篇介紹。

 

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