MySQL是由瑞典MySQL AB公司開發的關系數據庫管理系統,屬于Oracle旗下的產品。MySQL數據表引擎包括MyISAM,InnoDB,HEAP,BOB,ARCHIVE,CSV等。其中,MyISAM:成熟,穩定,易于管理且易于讀取。表級鎖不支持某些功能(事務等)。InnoDB:支持事務,外鍵等功能,數據行鎖定。它占用大量空間,并且不支持全文本索引(5.6.4之后支持全文本索引)。兩種常用的引擎是:MyISAM和InnoDB。
MySQL 的存儲引擎,myisam和innodb的區別?
1.MyISAM 是非事務的存儲引擎,適合用于頻繁查詢的應用。表鎖,不會出現死鎖,適合小數據,小并發。
2.innodb是支持事務的存儲引擎,合于插入和更新操作比較多的應用,設計合理的話是行鎖(最大區別就在鎖的級別上),適合大數據,大并發。
MySQL的事務
MySQL事務主要用于處理操作量大,復雜度高的數據。比如說,在人員管理系統中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操作語句就構成一個事務!
1.在MySQL中只有使用了Innodb數據庫引擎的數據庫或表才支持事務。
2.事務處理可以用來維護數據庫的完整性,保證成批的 SQL 語句要么全部執行,要么全部不執行。
3.事務用來管理insert,update,delete 語句:
一般來說,事務是必須滿足4個條件(ACID):原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。
(1)原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
(2)一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。
(3)數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。
(4)事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
(5)事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
事務的隔離級別
1.Read uncommitted 讀未提交,顧名思義,就是一個事務可以讀取另一個未提交事務的數據。事例:老板要給程序員發工資,程序員的工資是3.6萬/月。但是發工資時老板不小心按錯了數字,按成3.9萬/月,該錢已經打到程序員的戶口,但是事務還沒有提交,就在這時,程序員去查看自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。但是老板及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。分析:實際程序員這個月的工資還是3.6萬,但是程序員看到的是3.9萬。他看到的是老板還沒提交事務時的數據。這就是臟讀。
2.Read committed 讀提交,顧名思義,就是一個事務要等另一個事務提交后才能讀取數據。事例:程序員拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(程序員事務開啟),收費系統事先檢測到他的卡里有3.6萬,就在這個時候!程序員的妻子要把錢全部轉出充當家用,并提交。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了(第二次檢測金額當然要等待妻子轉出金額事務提交完)。程序員就會很郁悶,明明卡里是有錢的…分析:這就是讀提交,若有事務對數據進行更新(UPDATE)操作時,讀操作事務要等待這個更新操作事務提交后才能讀取數據,可以解決臟讀問題。但在這個事例中,出現了一個事務范圍內兩個相同的查詢卻返回了不同數據,這就是不可重復讀。
3.Repeatable read 重復讀,就是在開始讀取數據(事務開啟)時,不再允許修改操作事例:程序員拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(事務開啟,不允許其他事務的UPDATE修改操作),收費系統事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。分析:重復讀可以解決不可重復讀問題。寫到這里,應該明白的一點就是,不可重復讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。
4.Serializable 序列化 Serializable 是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀、不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不使用。什么時候會出現幻讀?事例:程序員某一天去消費,花了2千元,然后他的妻子去查看他今天的消費記錄(全表掃描FTS,妻子事務開啟),看到確實是花了2千元,就在這個時候,程序員花了1萬買了一部電腦,即新增INSERT了一條消費記錄,并提交。當妻子打印程序員的消費記錄清單時(妻子事務提交),發現花了1.2萬元,似乎出現了幻覺,這就是幻讀。序列化解決幻讀?! ?/p>
以上就是關于MySQL的引擎和事務的相關內容介紹,想了解更多MySQL數據庫的信息,請繼續關注中培偉業。