(以下為復習完一部分資料后又寫了一遍,為了加深印象)
一、非關系型數據庫和關系型數據庫區別,優勢比較
非關系型數據庫:
稱為:NoSQL,也就是not only sql 意味不僅僅是SQL。非關系型數據庫不需要寫一些較為復雜得SQL語句,其內部得存儲方法是以key-value得形式。常見得非關系型數據庫有Hbase、Redis、MongoDB等。非關系型數據庫不需要經過SQL得重重解析,所以性能很高;非關系型數據庫得可擴展性比較強,數據之間沒有耦合性,遇見需要添加得字段,就直接增加一個key-value得鍵值對就行了。
關系型數據庫:
以表格得形式存在,以行和列得形式存取數據,關系型數據庫得這一系列得列和行被稱之為表,無數張表組成了數據庫,常見得關系型數據庫有Oracle,DB2,Microsoft SQL Server,MySQL等。關系型數據庫能夠支持較為復雜得SQL查詢,能夠體現出數據之間、表之間得關聯關系;關系型數據庫也支持事務,便於提交和回滾。
二、MySQL事務四大特性
首先什么是MySQL的事務:事務是一組操作,組成這組操作的各個單元,原子性中的要么全部成功要么全部失敗,這個特性就是事務。在MySQL中,事務是在引擎層實現的,只有使用innodb引擎的數據庫或表才支持事務。
1.原子性:事務得操作要么全部成功,要么全部失敗回滾。因此成功就必須全部應用到數據庫,操作失敗則對數據庫不能有任何影響。
2.一致性:一致性指得是一個事務在執行的前后其狀態一致。例如:A和B加起來的錢一共1000元,那么無論她們中間如何轉賬,轉了多少次,事務結束后兩個用戶的錢加起來還是1000元,這就是事務的一致性。
3.持久性:指的是事務一旦提交回滾,那么發生的改變就會是永久性的,即使數據庫遇到特殊情況也不會產生干擾。
4.隔離性:當多個事務同時進行的時就有可能出現臟讀、不可重復讀、幻讀的情況,為了解決這些並發問題,提出了隔離性的概念。
臟讀:當事務A讀取了事務B的數據,事務B沒有提交,然后事務B執行了回滾操作,這時候事務A讀取到的數據就是臟讀;
不可重復讀:事務A進行多次的數據讀取操作,事務B在事務A讀取的過程中進行更新數據並提交,事務A讀取到的數據不一致;
幻讀:事務A在數據庫中將所有學生的成績A-B(例如排序),這個時候事務B手動插入了一條成績為A的數據,事務A更新數據完畢發現多了一條沒有修改的數據,這個情況就是出現了幻讀。
SQL的隔離級別有四種:
讀未提交:指得是一個事務在提交之前,所做的修改就能夠被其他事務看到。
讀已提交:指的是一個事務在提交之后,所做的修改才能夠被其他事務看到。
可重復讀:指得是一個事務在執行的過程中,看到的數據和啟動時看到的數據是一致的。未提交的變更對其他事務不可見。
串行化:指得是會對於同一行記錄,寫會加寫鎖,讀會加讀鎖。當出現讀寫鎖沖突的時候,后訪問的事務必須等待前一個事務執行完畢,才能繼續執行。
這四個隔離級別可以解決臟讀、不可重復讀、幻讀這三類問題
級別由低到高是:讀未提交 < 讀已提交 < 可重復讀 < 串行化
注意:大部分的隔離級別越高,越能夠保證數據的完整性和一致性,但是對並發的性能影響越大。大多數數據庫的默認級別是讀已提交,比如Sql Server 、Oracle,但是MySQL的默認隔離級別是可重復讀。