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