前言
我是真的不想在csdn上面寫博客了,但看看其他的網站,唉,我還是回來吧。
涉及到的知識點
事務併發產生的問題,事務的隔離級別
正文
事務
一般第一個討論的問題應該都是what,什麼是事務,那我也給大家粘貼一下一個百科釋義
指作爲單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。
然後事務的四大特性也是老生常談了,ACID,這我也不說了
然後這幾個特性又是如何實現的,不知道有沒有童鞋想過,涉及到兩個文件,redo 和 undo 。
具體的就不說了,留到後面咱們討論mvcc的時候,在詳細說明。
開啓方式
自動開啓
在咱們做增刪改的時候,事務就自動開啓提交了,不然你可以用show VARIABLES like 'autocommit' 看一下,是不是自動提交。
它又分爲兩個級別,global和session,一般情況下咱麼都不和global玩
我們可以用set session autocommit = off/on 來設置是不是自動提交,
手動開啓
開啓:begin / start transaction
提交/回滾:commit / rollback
事務併發產生的三大問題
髒讀
指,一個事務中,先後兩次讀取同一條數據,而在此期間有另一個事務對其進行修改,但沒有提交,而是進行了回滾,那此時第一個事務就懵逼了。
可重複讀
指,一個事務中,先後兩次讀取同一條數據,而在此期間有另一個事務對其進行了修改,並提交了數據,那此時第一個事務就懵逼了。
幻讀
指,一個事務中,先後兩次讀取某個範圍內的數據,而在此期間有另一個事務對其進行了插入操作,那此時第一個事務再一次的懵逼了。
對比
髒讀VS可重複讀:都是一個事務讀取同一條數據,先後不一致的問題,髒讀爲第二個事務回滾了事務,可重複讀爲第二個事務提交了事務
可重複度VS幻讀:都是事務提交事務之後產生的問題,可重複讀爲update / delete,幻讀爲insert
隔離級別
四個隔離級別
Read Uncommitted(讀未提交)—— 不能解決任何問題
Read Committed(讀已提交)—— 解決髒讀問題
Repeatable Read(可重複讀)—— 解決髒讀和重複讀問題,innodb中已解決幻讀問題
Serializable(串行化)—— 可以解決所有問題
隔離級別的實現方式
第一種:在讀取數據前,對其進行加鎖,組織其他事務對數據進行修改(LBCC)Lockbased Concurrent Control
第二種:生成一個數據請求時間點的一致性數據快照(Snapshot),並用這個快照來提供一定級別(語句級或事務級)的一致性讀取(MVCC)Multiversion Concurrency Control
然後基本上今天的所有內容已經結束了,在最後簡單的總結一下。
事務挺好的,但是在事務併發執行時會有些問題,於是針對這些問題產生了對應的隔離界別,然後隔離級別的實現方式又有兩個,是接下來的兩篇文章將要涉及到的內容。
結語
Hello Wrold