數據庫學習筆記(一)
阿新 • • 發佈:2019-01-20
cit action 提升性能 修改 事務 做的 nco 失敗 align
一、關系數據庫
關系數據庫,也就是以關系為核心來組織數據的數據庫。它的理念是把數據盡可能拆分成多個二維表格,不同的表之間通過某種關系來連接起來。這樣的好處有:
- 如果數據的某一部分需要變動,只需要變動該數據所處的表就行,而不需要重新設計整個數據庫。(前提是最開始就把關系模型設計得足夠好。。)
- 可以進行復雜的 SQL 查詢
- 保證事務的一致性
事務的 ACID 特性
關系數據庫保證事務滿足以下四個特性:
- 原子性(Atomicity):整個事務中的所有操作,要麽全部完成,要麽全部不完成,不存在只有一部分完成的情況。如果事務在執行過程中觸發了異常,整個事務都會失敗並中止,數據庫不會被改變。(因為沒有
COMMIT
- 註意事務失敗並不會自動
ROLLBACK
!需要手動檢測 SQLEXCEPTION,然後將事務ROLLBACK
到某個SAVEPOINT
或者直接ROLLBACK
整個事務 - 一句話總結,就是記錄 DB 之前的版本,允許回滾
- 註意事務失敗並不會自動
- 持久性(Durability):一旦事務成功執行,它所作的更改就會一直存在於數據庫中,不會丟失。(實際上持久性有很多的級別,保證數據絕對不丟失的方法並不存在)
- 隔離性(Isolation):在並發事務下,各事務相互獨立互不幹擾。(或者說一個事務所做的修改在最終提交以前,該修改對其他事務不可見)
- 隔離性是為了避免並發事務的線程安全問題引入的
- 為了平衡性能與隔離性,定義了以下四個隔離級別(可以說是適當的破壞一致性來提升性能與並行度
- Read Uncommitted
- Read Committed
- Repeatable Read
- Serializable(所有的事務操作都必須串行操作,完全隔離)
Isolation level | Dirty reads | Non-repeatable reads | Phantoms(幻讀) |
---|---|---|---|
Read Uncommitted |
may occur |
may occur | may occur |
Read Committed | don‘t occur | may occur | may occur |
Repeatable Read | don‘t occur | don‘t occur | may occur |
Serializable | don‘t occur | don‘t occur | don‘t occur |
- 一致性(Consistency):如果事務是並發多個,其外在表現也必須與串行事務一致。也就是說事務開始和結束之間的中間狀態不會被其他事務看到。
AID 是手段,C 是目的。
MySQL 的 innoDB 引擎默認的隔離級別為 Repeatable Read,而 SQL Server、PostgrelSQL、Oracle 都以 Read Committed 為默認隔離級別。隔離級別可手動修改。
參考
- 『淺入深出』MySQL 中事務的實現
數據庫學習筆記(一)