电竞比分网-中国电竞赛事及体育赛事平台

分享

數(shù)據(jù)庫(kù)事務(wù)4種隔離級(jí)別及7種傳播行為

 liang1234_ 2019-02-21

一:數(shù)據(jù)庫(kù)的事物隔離級(jí)別與傳播行為總結(jié):

            

很多人容易搞混不可重復(fù)讀和幻讀,確實(shí)這兩者有些相似。但不可重復(fù)讀重點(diǎn)在于update和delete,而幻讀的重點(diǎn)在于insert。
避免不可重復(fù)讀需要鎖行就行
避免幻影讀則需要鎖表
如果使用鎖機(jī)制來(lái)實(shí)現(xiàn)這兩種隔離級(jí)別,在可重復(fù)讀中,該sql第一次讀取到數(shù)據(jù)后,就將這些數(shù)據(jù)加鎖,其它事務(wù)無(wú)法修改這些數(shù)據(jù),就可以實(shí)現(xiàn)可重復(fù) 讀了。但這種方法卻無(wú)法鎖住insert的數(shù)據(jù),所以當(dāng)事務(wù)A先前讀取了數(shù)據(jù),或者修改了全部數(shù)據(jù),事務(wù)B還是可以insert數(shù)據(jù)提交,這時(shí)事務(wù)A就會(huì) 發(fā)現(xiàn)莫名其妙多了一條之前沒(méi)有的數(shù)據(jù),這就是幻讀,不能通過(guò)行鎖來(lái)避免。需要Serializable隔離級(jí)別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這么做可以有效的避免幻讀、不可重復(fù)讀、臟讀等問(wèn)題,但會(huì)極大的降低數(shù)據(jù)庫(kù)的并發(fā)能力。
所以說(shuō)不可重復(fù)讀和幻讀最大的區(qū)別,就在于如何通過(guò)鎖機(jī)制來(lái)解決他們產(chǎn)生的問(wèn)題。


數(shù)據(jù)庫(kù)中事務(wù)的四大特性(ACID)
(1) 原子性 ⑵ 一致性 ⑶ 隔離性 ⑷ 持久性
現(xiàn)在來(lái)看看MySQL數(shù)據(jù)庫(kù)為我們提供的事物的四種隔離級(jí)別:
關(guān)于spring的事務(wù)隔離級(jí)別與數(shù)據(jù)庫(kù)的一樣,也是下面的四個(gè),只不過(guò)多了一個(gè)default
1.Read uncommitted (讀未提交):最低級(jí)別,任何情況都無(wú)法保證。
2.Read committed (讀已提交):可避免臟讀的發(fā)生。
3.Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。
4.Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。

 以上四種隔離級(jí)別最高的是Serializable級(jí)別,最低的是Read uncommitted級(jí)別,當(dāng)然級(jí)別越高,執(zhí)行效率就越低。像Serializable這樣的級(jí)別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時(shí)選用何種隔離級(jí)別應(yīng)該根據(jù)實(shí)際情況。在MySQL數(shù)據(jù)庫(kù)中默認(rèn)的隔離級(jí)別為Repeatable read (可重復(fù)讀)。
  在MySQL數(shù)據(jù)庫(kù)中,支持上面四種隔離級(jí)別,默認(rèn)的為Repeatable read (可重復(fù)讀);而在Oracle數(shù)據(jù)庫(kù)中,只支持Serializable (串行化)級(jí)別和Read committed (讀已提交)這兩種級(jí)別,其中默認(rèn)的為Read committed級(jí)別

isolation(隔離)
4.查看MySQL數(shù)據(jù)庫(kù)當(dāng)前事務(wù)的隔離級(jí)別 select @@tx_isolation;

5.在MySQL數(shù)據(jù)庫(kù)中設(shè)置事務(wù)的隔離 級(jí)別: set tx_isolation=’隔離級(jí)別名稱;’

6.查看mysql的事物是否是自動(dòng)提交
1或者on代表啟用,0或者off代表禁用,當(dāng)autocommit=0時(shí),所有的差丶都是在一個(gè)事物中,直到顯示的執(zhí)行commit提交或者rollback回滾,該事物結(jié)束,同時(shí)又開始了另一個(gè)新的事物


二:數(shù)據(jù)庫(kù)的傳播行為:

傳播行為分為兩種:分為支持事物的傳播和不支持事物的傳播
1、PROPAGATION_REQUIRED:(支持事物)如果當(dāng)前沒(méi)有事務(wù),就創(chuàng)建一個(gè)新事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),該設(shè)置是最常用的設(shè)置。
2、PROPAGATION_SUPPORTS:(支持事物)支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),如果當(dāng)前不存在事務(wù),就以非事務(wù)執(zhí)行?!?/span>
3、PROPAGATION_MANDATORY:(支持事物)支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù),就加入該事務(wù),如果當(dāng)前不存在事務(wù),就拋出異常。
4、PROPAGATION_REQUIRES_NEW:(支持事物)創(chuàng)建新事務(wù),無(wú)論當(dāng)前存不存在事務(wù),都創(chuàng)建新事務(wù)。
5、PROPAGATION_NOT_SUPPORTED:(不支持事物)以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
6、PROPAGATION_NEVER:(不支持事物)以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
7、PROPAGATION_NESTED:(不支持事物)如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。如果當(dāng)前沒(méi)有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。
已混淆點(diǎn):spring的事務(wù)是什么?與數(shù)據(jù)庫(kù)的事務(wù)是否一樣
本質(zhì)上其實(shí)是同一個(gè)概念,spring的事務(wù)是對(duì)數(shù)據(jù)庫(kù)的事務(wù)的封裝,最后本質(zhì)的實(shí)現(xiàn)還是在數(shù)據(jù)庫(kù),假如數(shù)據(jù)庫(kù)不支持事務(wù)的話,spring的事務(wù)是沒(méi)有作用的.數(shù)據(jù)庫(kù)的事務(wù)說(shuō)簡(jiǎn)單就只有開啟,回滾和關(guān)閉,spring對(duì)數(shù)據(jù)庫(kù)事務(wù)的包裝,原理就是拿一個(gè)數(shù)據(jù)連接,根據(jù)spring的事務(wù)配置,操作這個(gè)數(shù)據(jù)連接對(duì)數(shù)據(jù)庫(kù)進(jìn)行事務(wù)開啟,回滾或關(guān)閉操作

參考文章:

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多