MySQL 中事务、事务隔离级别详解
一、事務的概念
1、事務的概念
2、在mysql中哪些存儲引擎(表類型)支持事務哪些不支持
3、事務的四個屬性
4、mysql事務的創建與存在周期
5、mysql行為
6、事務的隔離性和性能
7、mysql的偽事務
事務由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作為一個不可分割的整體,如果單元中某條SQL語句一旦執行失敗或產生錯誤,整個單元將會回滾。所有受到影響的數據將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,則事物被順利執行。
二、MySQL 中的存儲引擎以及支持事務,和不支持事務的存儲引擎?
1、存儲引擎的概念:在mysql中的數據用各種不同的技術存儲在文件(或內存)中。
這些技術中的每一種技術都使用不同的存儲機制,索引 技巧,并且最終提供廣泛的不同的功能和能力。可以通過選擇不同的技術,可以獲得額外的速度或功能,從而改善應用的整體功能。
2、這些不同的技術以及配套的相關功能在mysql中被稱為存儲引擎(也稱為表類型)。
3、通過show engines;來查看mysql支持的存儲引擎。
4、 在mysql中用的最多的存儲引擎有:innodb,bdb,myisam ,memory 等。其中innodb和bdb支持事務而myisam等不支持事務。
?三、事務的四個屬性
1、原子性:事務是由一個或一組相互關聯的SQL語句組成,這些語句被認為是一個不可分割的單元,要么都成功要么全回滾。
2、一致性:對于數據庫的修改是一致的,即多個用戶查的的數據是一樣的。一致性主要由mysql的日志機制處理,他記錄數據的變化,為事務恢復提供跟蹤記錄。
3、隔離性:每個事務都有自己的空間,和其他發生在系統中的事務隔離開來,而且事務的結果只在他完全被執行時才能看到
4、持久性:但提交了這個事務之后對數據的修改更新就是永久的。當一個事務完成,數據庫的日志已經被更新時,持久性即可發揮其特有的 功效,在mysql中,如果系統崩潰或者數據存儲介質被破壞,通過日志,系統能夠恢復在重啟前進行的最后一次成功更新,可以反應系統崩潰時處于執行過程的事物的變化。
四、事務的創建及生存周期
對于支持事務的存儲引擎,一個事務的周期:
1、在創建事務的過程中,用戶需要創建一個innodb或bdb類型的數據表,其基本命令結構如下:
?create? table table_name? (file? defintions)? type=innodb/bdb;
2、對表類型進行修改
?alert? table table-name? type =innodb/bdb;
3、事務的整個過程
?use? databases;?? //使用某個數據庫
?start transaction ;?? //開始事務 、這里也可以使用 begin?? 、 beginwork
?insert? into stu1 values('',? );?? //進行相關的操作
?commit??? //提交事物
?rollback?? //撤銷事務(事務回滾)
?五:mysql行為
1、我們在使用mysql是如果關閉之后,打開在查詢的話就會發現,哪些數據已經保存了,但是我們知道,在這過程中沒有進行顯示或隱式提交,問什么會這樣那?因為我們在mysql中設置了自動提交,但我們也可以改為手動提交。
2、 set?? autocommit =0;? //關閉自動提交
3、 set?? autocommit =1;? //開啟自動提交
?六、事務的隔離性
現在重點來說明下事務的隔離性,當多個線程都開啟事務操作數據庫中的數據時,數據庫系統要能進行隔離操作,以保證各個線程獲取數據的準確性,下面看看四種隔離界別
1、READ? UNCOMMITTED(未提交讀/臟讀)
(1)、該隔離級別的事務,在數據修改過程中,即使沒有提交,其他事務對于這些數據也是可讀的。事務可讀到未提交的數據也叫臟讀(Dirty Read),由于臟讀在實際應用中會導致很多問題,一般這類隔離級別應用很少。
2、READ COMMITTED(不可重復讀/提交后讀)
(1)、不可重復讀是指在對于數據庫中的某個數據,一個事務范圍內多次查詢卻返回了不同的數據值,這是由于在查詢間隔,被另一個事務修改并提交了。
例如事務T1在讀取某一數據,而事務T2立馬修改了這個數據并且提交事務給數據庫,事務T1再次讀取該數據就得到了不同的結果,發送了不可重復讀。不可重復讀和臟讀的區別是,臟讀是某一事務讀取了另一個事務未提交的臟數據,而不可重復讀則是讀取了前一事務提交的數據。
(2)、(一般數據庫默認事務級別)只有當前事務執行完,把數據提交之后,其他事務才可對這些數據進行讀取。也叫不可重復讀,因為其他事務執行2次查詢可能前后會得到2個不同結果(事務執行前讀一次,執行后讀一次)。
3、REPEATABLE? READ(可重讀/幻讀)
(1)、幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個數據項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是為“1”并且提交給數據庫。
而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。幻讀和不可重復讀都是讀取了另一條已經提交的事務(這點就臟讀不同),所不同的是不可重復讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體(比如數據的個數)。
(2)、(Mysql的默認隔離級別)解決了臟讀的問題,該級別保證了在同一事務中,多次讀取的結果是一致的。但仍舊無法解決幻讀問題。幻讀:事務A在讀取一定范圍內數據時,事務B有對該范圍數據進行插入等更新操作,事務A再次讀取該范圍記錄時,會產生幻讀。
4、SERIALIZABLE(序列化/串行化) ?
(1)、在讀取每一行數據的時候都對該行數據加鎖,強制事務串行執行,在事務提交的時候會釋放鎖,這時其他事務才能獲取相關數據的鎖進行處理這樣避免了幻讀問題,隔離性達到了最高但是這種執行方式效率 低,鎖競爭激烈容易出現超時問題。
只有在對數據一致性要求很強的時候和沒有并發或并發量很小的時候使用!
5、事務隔離級別的查看和修改
查看:select @@tx_isolation;
修改:set? global? transaction? isolation level? 設置的隔離級別;
6、mysql中支持的四種隔離級別
(1)、Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。
(2)、Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。
(3)、Read committed (讀已提交):可避免臟讀的發生。
(4)、Read uncommitted (讀未提交):最低級別,任何情況都無法保證。
七、偽事務(鎖定)
1、在MySQL中根據不同的需求,提供了很多存儲引擎,但是有的存儲引擎不支持事務,對于這種情況,可以使用表鎖定來代替事務。
2、對于不支持事務的存儲引擎MYISAM類型數據表,當用戶插入,修改,刪除時,這些操作都會立即保存到磁盤中,當多用戶同時操作某個表時,可以使用表鎖定來避免同一時間有多個用戶對數據庫中指定表進行操作,這樣可以避免在用戶操作數據表過程中受到干擾。
只有在用戶釋放表的操作鎖定后,其他用戶才可以訪問這些修改的數據表。
這里的鎖和java多線程中鎖的作用一樣,個人覺的可以這樣理解。
3、對指定表進行鎖操作的過程:
?(1)lock? table table-name lock type ;?? //locktype 有read 和write 兩種
對多個表進行加鎖:
?lock table? table-name1 lock type, table -name2? lock type ,table -name3 lock type;
(2)在指定的表中進行相應的操作
(3)當用戶完成對鎖定數據表的操作后,進行解鎖。
unlock tables ;? //釋放了所有加鎖表的鎖。
總結
以上是生活随笔為你收集整理的MySQL 中事务、事务隔离级别详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机双一流a水平大学,教育部公布:全国
- 下一篇: restful get不传参数404_你