為了更好的理解并發(fā)和同步,我們需要先明白兩個(gè)重要的概念:同步和異步
同步和異步的區(qū)別和聯(lián)系
一句話總結(jié):同步就是一件事一件事的做,沒做完不能做其他事。異步就是,可以做多個(gè)互不影響的事。
舉例:
吃飯和說話就是同步,因?yàn)橹挥幸粡堊臁?/b>
吃飯的時(shí)候聽歌,看電視,就是異步,互不影響。
并發(fā)測試工具:JMeter
數(shù)據(jù)庫事務(wù)的隔離級(jí)別
臟讀: 事務(wù)A讀取了 被 事務(wù)B已修改但未提交的數(shù)據(jù)。假如B回退,則事務(wù)A讀取的是無效的數(shù)據(jù)。
不可重復(fù)讀 :在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的。
幻讀:發(fā)生在當(dāng)兩個(gè)完全相同的查詢執(zhí)行時(shí),第二次查詢所返回的結(jié)果集跟第一個(gè)查詢不相同。例如:第一次查詢有5條數(shù)據(jù),執(zhí)行第二次查詢前,插入了一條數(shù)據(jù),第二次查詢時(shí)就有6條數(shù)據(jù)。
為了解決上述問題數(shù)據(jù)庫提供以下四種隔離級(jí)別:
讀未提交(Read Uncommitted) ps:可以讀到未提交的內(nèi)容, 一般不會(huì)去用的。
在這種隔離級(jí)別下,查詢是不會(huì)加鎖的,也由于查詢的不加鎖,所以這種隔離級(jí)別的一致性是最差的,可能會(huì)產(chǎn)生“臟讀”、“不可重復(fù)讀”、“幻讀”。
讀提交(Read Committed)ps:只能讀到已經(jīng)提交了的內(nèi)容, 各種系統(tǒng)中最常用的一種隔離級(jí)別。
可避免“臟讀”,并不能避免“不可重復(fù)讀”和“幻讀”。
如需要加鎖,需要顯式的加鎖,普通查詢不會(huì)加鎖。select * from Table where id = 1 for update
可重復(fù)讀(Repeated Read)ps:專門針對(duì)“不可重復(fù)讀”這種情況而制定的隔離級(jí)別。
當(dāng)事務(wù)啟動(dòng)時(shí),就不允許進(jìn)行“修改操作(Update)”了,而“不可重復(fù)讀”恰恰是因?yàn)閮纱巫x取之間進(jìn)行了數(shù)據(jù)的修改,因此,“可重復(fù)讀”能夠有效的避免“不可重復(fù)讀”,但卻避免不了“幻讀”,因?yàn)榛米x是由于“插入或者刪除操作(Insert or Delete)”而產(chǎn)生的。
串行化(Serializable)ps: 數(shù)據(jù)庫最高的隔離級(jí)別,這種級(jí)別下,事務(wù)“串行化順序執(zhí)行”,也就是一個(gè)一個(gè)排隊(duì)執(zhí)行。
這是數(shù)據(jù)庫的最高隔離級(jí)別,可以有效避免臟讀/幻讀/不可重復(fù)讀,但是效率奇差,性能開銷大。
