关系型数据库的基本知识
關系型數據庫
1、基于關系代數理論
2、缺點:表結構不直觀,實現復雜,速度慢
3、優點:健壯性高,社區龐大。
笛卡爾集結果
一個表查詢另一個表的Join數據(不帶on和任何條件),查詢出的結果就是兩個表的乘積,這個結果就稱為笛卡爾集。數據庫在做內連接語句的時候,它不會去查找笛卡爾集。它會根據你連接的條件去進行查詢。
左連接、右連接、內連接,四張圖給你講清楚。
左聯接和右連接
表A在左邊,表B在右邊,這個就是說包含表A中是Null的值也被顯示出來,同理,反之就是右連接。
內連接
取它們兩者之間的條件一致的數據,說簡單點就是取它們的交集
。
全連接
事務
ACID
原子性(Atomicity)
事務必須是一個自動工作的單元,要么全部執行,要么全部不執行。
一致性(Consistent)
事務結束的時候,所有的內部數據都是正確的。
隔離性(Isolation)
并發多個事務時,各個事務不干涉內部數據,處理的都是另外一個事務處理之前或之后的數據。
持久性(Durability)
事務提交之后,數據是永久性的,不可再回滾。
數據庫的隔離級別
臟讀:第一個事務讀取第二個事務正在更新的數據表,如果第二個事務還沒有更新完成,那么第一個事務讀取的數據將是一半為更新過的,一半還沒更新過的數據,這樣的數據毫無意義。
幻讀:第一個事務讀取一個結果集后,第二個事務,對這個結果集經行增刪操作,然而第一個事務中再次對這個結果集進行查詢時,數據發現丟失或新增。
Read uncommitted(臟讀)
事務中的修改,即使沒有提交,其他事務也可以看得到,比如說上面的兩步這種現象就叫做臟讀,這種隔離級別會引起很多問題,如無必要,不要隨便使用
Read Committed (讀取提交的值)
只能看到已經完成的事務的結果,正在執行的,是無法被其他事務看到的。這種級別會出現讀取舊數據的現象
Repeatable Reads(可重復讀)
解決了臟讀的問題,該級別保證了每行的記錄的結果是一致的,但是卻無法解決另一個問題,幻行,顧名思義就是突然蹦出來的行數據。指的就是某個事務在讀取某個范圍的數據,但是另一個事務又向這個范圍的數據去插入數據,導致多次讀取的時候,數據的行數不一致。
Serializable(可串行化)
最高的隔離級別,它通過強制事務串行執行(注意是串行),避免了前面的幻讀情況,由于他大量加上鎖,導致大量的請求超時,因此性能會比較底下,再特別需要數據一致性且并發量不需要那么大的時候才可能考慮這個隔離級別。
悲觀鎖
悲觀鎖假定其他用戶企圖訪問或者改變你正在訪問、更改的對象的概率是很高的,因此在悲觀鎖的環境中,在你開始改變此對象之前就將該對象鎖住,并且直到你提交了所作的更改之后才釋放鎖。
樂觀鎖
與悲觀鎖相反,樂觀鎖則認為其他用戶企圖改變你正在更改的對象的概率是很小的,因此樂觀鎖直到你準備提交所作的更改時才將對象鎖住,當你讀取以及改變該對象時并不加鎖。
死鎖
我們先來提兩個疑問:什么是死鎖,為什么會產生死鎖?先來看看一個例子。
A更新earth,請求earth的排它鎖,由于B占用著earth的排它鎖,等待。
B更新lives,請求lives的排它鎖,由于A占用著lives的排它鎖,等待。
向這樣相互等待對方釋放資源,造成資源讀寫擁擠堵塞的情況,就被稱為死鎖現象,也叫做阻塞,當然原因也是如此,解決方法只有犧牲某一方的事務讓它回滾,讓另一方的事務通行,這樣就不至于都堵著了。
那么如何減少死鎖的產生呢?
1、按照同一順序訪問數據庫資源,上述例子就不會發生死鎖啦。
2、保持是事務的簡短,盡量不要讓一個事務處理過于復雜的讀寫操作。事務過于復雜,占用資源會增多,處理時間增長,容易與其它事務沖突,提升死鎖概率。
3、盡量不要在事務中要求用戶響應,比如修改新增數據之后在完成整個事務的提交,這樣延長事務占用資源的時間,也會提升死鎖概率。
4、盡量減少數據庫的并發量。
5、盡可能使用分區表,分區視圖,把數據放置在不同的磁盤和文件組中,分散訪問保6、存在不同分區的數據,減少因為表中放置鎖而造成的其它事務長時間等待。
7、避免占用時間很長并且關系表復雜的數據操作。
8、使用較低的隔離級別,使用較低的隔離級別比使用較高的隔離級別持有共享鎖的時間更短。這樣就減少了鎖爭用。
總結
以上是生活随笔為你收集整理的关系型数据库的基本知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用AD打开PADS的PCB文件?
- 下一篇: linux cmake编译源码,linu