事務(wù)(transaction)概念
一組DML語(yǔ)句(select喉悴、update棱貌、delete等)在同一事務(wù)中,要么全都提交箕肃,要么全不提交
事務(wù)隔離性
讀未提交(read uncommitted)
- 事物A和事物B婚脱,事物A未提交的數(shù)據(jù),事物B可以讀取到
- 這里讀取到的數(shù)據(jù)叫做“臟數(shù)據(jù)”
- 這種隔離級(jí)別最低,這種級(jí)別一般是在理論上存在起惕,數(shù)據(jù)庫(kù)隔離級(jí)別一般都高于該級(jí)別
讀已提交(read committed)
- 事物A和事物B涡贱,事物A提交的數(shù)據(jù),事物B才能讀取到
- 這種隔離級(jí)別高于讀未提交
- 換句話說(shuō)惹想,對(duì)方事物提交之后的數(shù)據(jù)问词,我當(dāng)前事物才能讀取到
- 這種級(jí)別可以避免“臟數(shù)據(jù)”
- 這種隔離級(jí)別會(huì)導(dǎo)致“不可重復(fù)讀取”
- Oracle默認(rèn)隔離級(jí)別
可重復(fù)讀(repeatable read)
- 事務(wù)A和事務(wù)B,事務(wù)A提交之后的數(shù)據(jù)嘀粱,事務(wù)B讀取不到
- 事務(wù)B是可重復(fù)讀取數(shù)據(jù)
- 這種隔離級(jí)別高于讀已提交
- 換句話說(shuō)激挪,對(duì)方提交之后的數(shù)據(jù),我還是讀取不到
- 這種隔離級(jí)別可以避免“不可重復(fù)讀取”锋叨,達(dá)到可重復(fù)讀取
- 比如1點(diǎn)和2點(diǎn)讀到數(shù)據(jù)是同一個(gè)
- MySQL默認(rèn)級(jí)別
- 雖然可以達(dá)到可重復(fù)讀取垄分,但是會(huì)導(dǎo)致“幻像讀”
串行化(serializable)
- 事務(wù)A和事務(wù)B,事務(wù)A在操作數(shù)據(jù)庫(kù)時(shí)娃磺,事務(wù)B只能排隊(duì)等待
- 這種隔離級(jí)別很少使用薄湿,吞吐量太低,用戶體驗(yàn)差
- 這種級(jí)別可以避免“幻像讀”偷卧,每一次讀取的都是數(shù)據(jù)庫(kù)中真實(shí)存在數(shù)據(jù)豺瘤,事務(wù)A與事務(wù)B串行,而不并發(fā)
悲觀鎖與樂(lè)觀鎖
悲觀鎖
在一個(gè)事務(wù)結(jié)束之前听诸,別的事物無(wú)法對(duì)該數(shù)據(jù)進(jìn)行修改(影響并發(fā)性能)
樂(lè)觀鎖
允許多個(gè)事務(wù)同時(shí)修改坐求,一旦其中一個(gè)事務(wù)進(jìn)行了提交,則其他事務(wù)無(wú)法進(jìn)行提交
Django中應(yīng)用
model.objects.select_for_update().get() #加互斥鎖
# view函數(shù)前加transaction修飾符保證原子性
@transaction.atomic