在使用spring框架時肥隆,可以有兩種使用事務(wù)的方式冈敛,一種是編程式惧盹,一種是聲明式阀参。@Transactional注解就是聲明式的浓恶。
注:編程式就是指用begin和commit/rollback包圍起來的那個
首先,事務(wù)這個概念是數(shù)據(jù)庫層面的结笨,spring只是基于數(shù)據(jù)庫中的事務(wù)進(jìn)行了擴(kuò)展包晰,以及提供了一些能讓程序猿更加方便操作事務(wù)的方式。
比如炕吸,我們可以通過在某個方法上添加@Transacation注解伐憾,就可以開啟事務(wù),這個方法中所有的sql都會在一個事務(wù)中執(zhí)行赫模,統(tǒng)一成功或失敗树肃。
在一個方法上加了@Transactional注解后,Spring會基于這個類生成一個代理對象瀑罗,會將這個代理對象作為bean(將這個bean放入IOC容器中)胸嘴,當(dāng)在使用這個代理對象的方法時(此時會獲取一個bean,獲取的是這個代理對象),如果這個方法上存在@Transactional注解斩祭,那么代理邏輯會先把事務(wù)的自動提交設(shè)置為false劣像,然后再去執(zhí)行原本的業(yè)務(wù)邏輯方法,如果執(zhí)行業(yè)務(wù)邏輯方法沒有出現(xiàn)異常摧玫,那么代理邏輯中就會將事務(wù)進(jìn)行提交耳奕,如果執(zhí)行業(yè)務(wù)邏輯方法出現(xiàn)了異常,那么則會將事務(wù)進(jìn)行回滾(回滾的前提是異常沒有被catch掉诬像,需要拋出來)屋群。
當(dāng)然,針對哪些異郴的樱回滾事務(wù)是可以配置的芍躏,可以利用@Transactional注解中的rollbackFor屬性進(jìn)行配置,默認(rèn)情況下會對RuntimeException和Error進(jìn)行回滾降狠。
spring事務(wù)隔離級別就是數(shù)據(jù)庫的隔離級別:外加一個默認(rèn)級別
read uncommitted(未提交讀)
read committed(提交讀对竣、不可重復(fù)讀)
repeatable read(可重復(fù)讀)
serializable(可串行化)
注:Oracle的默認(rèn)隔離級別是:read committed(提交讀、不可重復(fù)讀)喊熟;Mysql的默認(rèn)隔離級別:repeatable read(可重復(fù)讀)
數(shù)據(jù)庫的配置隔離級別是Read Commited,而Spring配置的隔離級別是Repeatable Read柏肪,請問這時隔離級別是以哪一個為準(zhǔn)姐刁?
答:以Spring配置的為準(zhǔn)芥牌,如果spring設(shè)置的隔離級別數(shù)據(jù)庫不支持,效果取決于數(shù)據(jù)庫