一:數(shù)據(jù)庫的事物隔離級別與傳播行為總結(jié): 很多人容易搞混不可重復(fù)讀和幻讀,確實(shí)這兩者有些相似。但不可重復(fù)讀重點(diǎn)在于update和delete,而幻讀的重點(diǎn)在于insert。 避免不可重復(fù)讀需要鎖行就行 避免幻影讀則需要鎖表 如果使用鎖機(jī)制來實(shí)現(xiàn)這兩種隔離級別,在可重復(fù)讀中,該sql第一次讀取到數(shù)據(jù)后,就將這些數(shù)據(jù)加鎖,其它事務(wù)無法修改這些數(shù)據(jù),就可以實(shí)現(xiàn)可重復(fù) 讀了。但這種方法卻無法鎖住insert的數(shù)據(jù),所以當(dāng)事務(wù)A先前讀取了數(shù)據(jù),或者修改了全部數(shù)據(jù),事務(wù)B還是可以insert數(shù)據(jù)提交,這時(shí)事務(wù)A就會 發(fā)現(xiàn)莫名其妙多了一條之前沒有的數(shù)據(jù),這就是幻讀,不能通過行鎖來避免。需要Serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這么做可以有效的避免幻讀、不可重復(fù)讀、臟讀等問題,但會極大的降低數(shù)據(jù)庫的并發(fā)能力。 所以說不可重復(fù)讀和幻讀最大的區(qū)別,就在于如何通過鎖機(jī)制來解決他們產(chǎn)生的問題。 數(shù)據(jù)庫中事務(wù)的四大特性(ACID) (1) 原子性 ⑵ 一致性 ⑶ 隔離性 ⑷ 持久性 現(xiàn)在來看看MySQL數(shù)據(jù)庫為我們提供的事物的四種隔離級別: 關(guān)于spring的事務(wù)隔離級別與數(shù)據(jù)庫的一樣,也是下面的四個(gè),只不過多了一個(gè)default 1.Read uncommitted (讀未提交):最低級別,任何情況都無法保證。 2.Read committed (讀已提交):可避免臟讀的發(fā)生。 3.Repeatable read (可重復(fù)讀):可避免臟讀、不可重復(fù)讀的發(fā)生。 4.Serializable (串行化):可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。 以上四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,當(dāng)然級別越高,執(zhí)行效率就越低。像Serializable這樣的級別,就是以鎖表的方式(類似于Java多線程中的鎖)使得其他的線程只能在鎖外等待,所以平時(shí)選用何種隔離級別應(yīng)該根據(jù)實(shí)際情況。在MySQL數(shù)據(jù)庫中默認(rèn)的隔離級別為Repeatable read (可重復(fù)讀)。 在MySQL數(shù)據(jù)庫中,支持上面四種隔離級別,默認(rèn)的為Repeatable read (可重復(fù)讀);而在Oracle數(shù)據(jù)庫中,只支持Serializable (串行化)級別和Read committed (讀已提交)這兩種級別,其中默認(rèn)的為Read committed級別 isolation(隔離) 4.查看MySQL數(shù)據(jù)庫當(dāng)前事務(wù)的隔離級別: select @@tx_isolation; 5.在MySQL數(shù)據(jù)庫中設(shè)置事務(wù)的隔離 級別: set tx_isolation=’隔離級別名稱;’ 6.查看mysql的事物是否是自動提交 1或者on代表啟用,0或者off代表禁用,當(dāng)autocommit=0時(shí),所有的差丶都是在一個(gè)事物中,直到顯示的執(zhí)行commit提交或者rollback回滾,該事物結(jié)束,同時(shí)又開始了另一個(gè)新的事物 二:數(shù)據(jù)庫的傳播行為:傳播行為分為兩種:分為支持事物的傳播和不支持事物的傳播 1、PROPAGATION_REQUIRED:(支持事物)如果當(dāng)前沒有事務(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ù),無論當(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)前沒有事務(wù),則執(zhí)行與PROPAGATION_REQUIRED類似的操作。 已混淆點(diǎn):spring的事務(wù)是什么?與數(shù)據(jù)庫的事務(wù)是否一樣 本質(zhì)上其實(shí)是同一個(gè)概念,spring的事務(wù)是對數(shù)據(jù)庫的事務(wù)的封裝,最后本質(zhì)的實(shí)現(xiàn)還是在數(shù)據(jù)庫,假如數(shù)據(jù)庫不支持事務(wù)的話,spring的事務(wù)是沒有作用的.數(shù)據(jù)庫的事務(wù)說簡單就只有開啟,回滾和關(guān)閉,spring對數(shù)據(jù)庫事務(wù)的包裝,原理就是拿一個(gè)數(shù)據(jù)連接,根據(jù)spring的事務(wù)配置,操作這個(gè)數(shù)據(jù)連接對數(shù)據(jù)庫進(jìn)行事務(wù)開啟,回滾或關(guān)閉操作 參考文章: |
|