NoSQL 跟 SQL 的差別在哪裡?
- 因為 SQL 需要以比較嚴謹的的方式(表格)來儲存資料,而且資料之間要有明確的關聯,但在資料很大量且難以察覺其之間關聯的時候,要用這種嚴謹的方式處理資料就比較困難,所以需要 NoSQL。
- NoSQL 不支援 JOIN,且不需要以固定的結構來儲存資料,通常是以 key-value (類似 JSON 格式)來儲存,因此有很大的彈性空間來處理資料,適合用來儲存關聯較弱或結構不固定的資料。
參考資料:
Transaction 交易
- 由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原帳戶扣除金額,以及向目標帳戶添加金額,這兩個資料庫操作的總和,構成一個完整的邏輯過程,不可拆分。
- 就想像成是一筆交易就對了,例如說轉帳
A 轉帳 20 塊給 B,你要保證 A 少 20 塊的同時 B 多了 20 塊
實際應用:
- 轉帳
- 購物(一次買多個品項)
- 其他一次牽扯到多個 query 的操作
ACID
為了保證 Transaction 的正確性,要符合以下四個特性
- 原子性 atomicity:要嘛全部失敗,要嘛全部成功
- 一致性 consistency:維持資料的一致性(錢的總數相同),在異動開始和完成之後,資料庫皆必須維持合法的狀態。合法的狀態是指必須正確遵守資料庫所強制的規則。例如,如果將資料庫設定為不允許外部索引鍵參照不存在的資料列,那麼異動的結果將不能產生此狀況。
- 隔離性 isolation:多筆交易不會互相影響(不能同時改同一個值)
- 持久性 durability:交易成功之後,寫入的資料不會不見
什麼是資料庫的 lock?為什麼我們需要 lock?
- 因為多筆交易在資料的讀取與寫入的時候,彼此會相互影響,因此為了交易的concurrency與 isolation ,資料的讀取或是寫入的時候就會被做一個記號,這個記號用來告知該資料正在被讀取或是寫入的狀態,其他交易根據這個記號來決定是否要等待到該紀錄狀態結束或是直接讀取該資料而該”記號”就是所謂的 Locks
- 將某一筆資料 lock 住的話,在進行 query 操作時就可以確保不會有其他的 query 來同時操作這筆資料。
- 在 race condition (例如兩個 request 要同時執行同一個query)發生的時候,因為該資料被 lock 住所以一次只會有一個 query 可以操作,其他的要等待先到的 query 操作完成才能繼續,如此就可以避免例如掉購物網站賣東西的超賣問題。
- 但因為某筆資料被鎖住,其他後面才來的操作就需要等待,進而會有額外效能的損耗。
參考資料:
資料庫的交易鎖定 Locks