數據庫三範式、事務

三範式

第一範式(1NF)

  在一張表中,組成表的每個屬性都是不能再分的屬性,若是知足這一規則,則該表符合第一範式。mysql

                        

                     表1(不符合)                                                    表2(符合)sql

  表1的Info字段能夠再拆分,故不符合1NF;表2全部屬性不可再分,符合。數據庫

第二範式(2NF)

  首先要知足1NF,表中的每個非主屬性必須徹底依賴於本表的主鍵(候選鍵),而不能是部分依賴。併發

                      

            表1                             表2atom

  表1中,學號和課程爲聯合主鍵,因爲姓名屬性只依賴於學號,學分只依賴於課程,故不知足2NF;表2中,選修時間及成績都徹底依賴於主鍵,故符合2NF。由此也可知不知足2NF的狀況只會出如今有聯合主鍵的表中。spa

第三範式(3NF)

  首先知足1NF和2NF,另外全部非主屬性都是與主鍵直接相關,而不能是間接相關3d

                

                            表1blog

  表1中,客戶名稱與訂單號並非直接相關,而是能夠經過客戶號與訂單號間接相關,故不知足3NF事務

五大約束

  一、 Primary key:主鍵約束內存

  二、 UNIQUE:惟一性約束

  三、 NOT NULL:非空約束

  四、 Foreign key:外鍵約束

  五、 Default:默認值約束

事務

四大特性(ACID)

  一、 原子性(atomicity):一個事務是不可分割的,因此要麼執行其所有內容,要麼就根本不執行。若是一個事務開始執行,可是因爲某些緣由失敗了,則事務對數據庫形成的任何可能的修改都要撤銷。

  二、 一致性(consistency):一個事務做爲原子從一個一致的數據庫狀態開始獨立運行,則事務結束時數據庫也必須是再次是一致的。好比,在轉帳以前 A + B = 500,那麼在轉帳以後也應是A + B = 500。

  三、 隔離性(isolation):多個併發執行的事務間互不干擾。

  四、 持久性(durability):事務一旦提交,數據庫中的數據的改變是永久的,即便數據庫出現故障。

三讀

  一、 髒讀:兩個併發事務,事務T2讀取了事務T1未提交的數據。以下圖,事務T1還沒有提交,這時事務T2進來讀取了x的值,可是事務T1最終可能不提交而是進行了回滾,這樣T2就讀取了無效的x。

        

 

  二、 不可重複讀:在事務內存在屢次讀取某變量的操做,可是先後讀取的值不同。以下圖,事務T2存在兩次讀取x的操做,可是有可能在第一次讀取完的時候,T1事務執行把x值修改,T2再次讀取x的值就與第一次讀取的結果不同。

       

 

  三、 幻讀:在某個事務內先後執行了相同的操做(如查詢結果集),但獲得的結果集不同。以下圖,T1在T2執行的過程當中進行了插入操做,致使T2先後查詢結果不一致。

       

事務隔離性級別

  一、 可串行化(serializable):最高隔離級別,一般保證可串行化調度,可避免髒讀、不可重複讀和幻讀的發生。讀時加表級共享鎖,事務結束釋放;更新時加表級排他鎖,事務結束後釋放。

  二、 可重複讀(repeatable read):可避免髒讀、不可重複讀。讀時加行級共享鎖,直到事務結束釋放;更新時加排他鎖,直到事務結束後釋放。(mysql默認隔離級別)

  三、 已提交讀(read committed):可避免髒讀。讀時加行級共享鎖,讀完釋放;更新時加行級排他鎖,事務結束後釋放。

  四、 未提交讀(read uncommitted):最低隔離級別,容許讀取未提交數據。更新時加排他鎖,更新完釋放。

相關文章
相關標籤/搜索