MySQL存儲引擎和事務

以前學MySQL只是學些基本操作,前段時間學習了存儲引擎,索引,事務這些概念,寫篇博客記錄一下,方便自己以後查閱以及供其他需要者參考。

MySQL是一種關係型數據庫,開源免費,方便擴展,關係型數據庫的特點是將數據保存在不同的表中,再將這些表放入不同的數據庫中,而不是將所有的數據統一放在一個倉庫裏,這樣的設計加快了MySQL的讀取速度,提高了它的靈活性和可管理性。訪問及管理MySQL數據庫的最常用標準化語言爲SQL——結構化查詢語言。結構化查詢語言使得數據庫的存取和更新數據的操作變得更加容易。

 

1.存儲引擎

用cmd打開MySQL,輸入

show engines;

查看MySQL提供的所有存儲引擎(下圖爲MySQL8.0)

從圖中可以看出MySQL8.0的默認存儲引擎是InnoDB,且只有InnoDB支持事務。

MySQL5.5之前,默認數據庫引擎爲MyISAM,雖然性能良好,支持全文索引,表級鎖等,但是並不支持事務和行級鎖。MySQL5.5之後,引入了InnoDB,默認數據庫引擎改爲了InnoDB,支持事務、行級鎖和表級鎖(默認爲行級鎖)。

MyISAM與InnoDB的比較

MyISAM:只支持表級鎖;每次查詢具有原子性,性能相對較高,但是不支持事務;不支持外鍵。

InnoDB:支持行級鎖和表級鎖,默認爲行級鎖;支持事務,能進行回滾操作,事務相對安全;支持外鍵。

MySQL索引

MySQL索引有B+樹索引和哈希索引等;哈希索引底層數據結構是哈希表,所以單條記錄查詢時,選擇哈希索引查詢較快,其他大部分場景使用B+樹索引。

 

2.事務

事務的概念:小黑給小白轉賬100元,看起來好像是一個操作,實際上數據庫會進行兩步操作,先把小黑的賬戶減掉100元,再給小白的賬戶加上100元。如果這兩個操作之間出現問題,比如銀行的系統崩潰了,那麼就有可能導致小黑的賬戶減掉100元,而小白的賬戶並沒有加上100元。事務就是保證這兩個操作要麼都成功,要麼都失敗。

事務的四大特性(ACID)

  • 原子性:事務是最小執行單位,不可分割。原子性確保了操作要麼全部完成,要麼全部失效
  • 一致性:事務執行的前後,數據保持一致,多個事務對同一個數據讀取的結果是一樣的
  • 隔離性:併發訪問數據庫時,一個用戶的事務不會被其他事務干擾
  • 持久性:也該事務被提交後,它對數據庫中數據的改變是持久的,數據庫發送故障也不會產生影響

併發事務的問題

多個事務併發運行時,多個用戶經常會對同一數據進行操作,這就會導致出現一些問題

  • 髒讀:一個事務訪問數據庫並對數據進行了修改,但是這個修改還沒有被提交到數據庫中,這時另一個事務也訪問了這個數據,並使用了這個數據。因爲這個數據是還沒有提交的數據,所以另外一個事務讀到的這個數據就是錯誤的數據,也就是髒數據
  • 幻讀:一個事務讀取了幾行數據,接着另一個併發事務插入了一些數據,這就會導致第一個事務在之後的查詢中會發現多了一些原來並不存在的數據,就跟發生幻覺一樣
  • 不可重複讀:一個事務要執行多次讀取同一數據的操作,在這個事務還沒有結束時,另一個事務修改了該數據,在第一個事務的兩次讀取數據之間,由於第二個事務的修改導致第一個事務兩次讀取到的數據是不一樣的,因此稱爲不可重複度

事務的隔離級別

  • 讀未提交:隔離級別最低,允許讀取未提交的數據,可能會發生髒讀,幻讀和不可重複度
  • 讀已提交:允許讀取已提交的數據,可以防止出現髒讀,可能會發生幻讀和不可重複讀
  • 可重複讀:對同一數據的多次讀取的結果都是一樣的,可以防止出現髒讀和不可重複度,可能會發生幻讀
  • 串行化:隔離級別最高,服從ACID的隔離級別,可以防止出現髒讀、幻讀和不可重複度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章