視圖函數(shù)(Controller)
如何設(shè)計視圖函數(shù)
1.用戶的每個操作(用戶故事)對應(yīng)一個視圖函數(shù)臼节。
數(shù)據(jù)的完整性:
實體完整性 - 沒有冗余數(shù)據(jù) - 主鍵/唯一索引
參照完整性 - 外鍵
域完整性 - 數(shù)據(jù)類型 / 長度 / 非空約束 / 默認值約束 / 檢查約束
2.每個視圖函數(shù)可以構(gòu)成一個事務(wù)邊界。-
事務(wù)的ACID特性。
- 原子性(Atomicity):事務(wù)中各項的操作要么全做要么全不做;
- 一致性(Consistentcy):事務(wù)前后系統(tǒng)的狀態(tài)是一致的破婆;
- 隔離性(Isolation):并發(fā)執(zhí)行的事務(wù)無法看到彼此的中間狀態(tài)稠氮;
- 持久性(Duration):事務(wù)完成后所做的改動都會被持久化思灰。
事務(wù)隔離級別-設(shè)置事務(wù)隔離級別是為了數(shù)據(jù)庫底層依據(jù)事務(wù)隔離級別為數(shù)據(jù)加上適當(dāng)?shù)逆i。如果需要保證數(shù)據(jù)的強一致性儡循,那么關(guān)系型數(shù)據(jù)庫仍然是唯一的也是最好的選擇舶吗,因為關(guān)系型數(shù)據(jù)庫可以通過鎖機制來保護數(shù)據(jù)。事務(wù)隔離級別從低到高依次是:Read Uncommitted(讀未提交)择膝、Read Commited(讀提交)誓琼、Repeatable Read(可重復(fù)讀)、Searializable(串行化)。事務(wù)隔離級別越高腹侣,數(shù)據(jù)并發(fā)訪問的問題越少叔收,但是性能越差;事務(wù)隔離級別越低傲隶,數(shù)據(jù)并發(fā)訪問的問題越多饺律,但是性能越好。
數(shù)據(jù)庫并發(fā)訪問會產(chǎn)生的5種問題:
第1類丟失更新(A事務(wù)撤銷覆蓋B事務(wù)更新的數(shù)據(jù))和第2類丟失更新(A事務(wù)提交覆蓋B事務(wù)更新的數(shù)據(jù))跺株。
臟讀(讀臟數(shù)據(jù)):一個事務(wù)讀取到其他尚未提交的事務(wù)的數(shù)據(jù)复濒;
不可重復(fù)讀:一個事務(wù)在讀取它的查詢結(jié)果時,被另一個事務(wù)更新了他的查詢記錄導(dǎo)致無法讀到數(shù)據(jù)乒省。
幻讀:一個事務(wù)在讀取它的查詢結(jié)果時巧颈,發(fā)現(xiàn)讀到了被另一個事務(wù)提交的新數(shù)據(jù)。
set global transaction isolation level repeatable read;
#設(shè)置全局默認的事務(wù)隔離級別
set session transaction isolation level committed
#設(shè)置當(dāng)前會話的事務(wù)隔離級別
select @@tx_isolation
#查詢當(dāng)前會話的事務(wù)隔離級別-
Django中的事務(wù)控制作儿。
- 給每個請求綁定事務(wù)環(huán)境(反模式)洛二。
ATOMIC_REQUESTS = True
- 使用事務(wù)裝飾器(簡單易用)-粗粒度(控制不夠精細)。
@transaction.non_atomic_requests @transaction.atomic
- 使用上下文語法(細粒度-事務(wù)控制的范圍更加精確)攻锰。
- 給每個請求綁定事務(wù)環(huán)境(反模式)洛二。
with transaction.atomic()
pass
- 關(guān)閉自動提交使用手動提交晾嘶。
AUTOCOMMIT = False
transaction.commit()
transaction.rollback()
事務(wù) - 鎖進制 - InnoDB - 表級鎖/行級鎖 - 共享鎖、排他鎖
我們通過設(shè)置事務(wù)隔離級別讓數(shù)據(jù)庫自動選擇合適的鎖來保護數(shù)據(jù)
Authentication / Authorization
兩種方式:RBAC(基于角色的訪問控制) / ACL(訪問控制列表)