這篇文章主要介紹spring事務(wù)及聲明式事務(wù)的使用方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)客戶idc服務(wù)中心,提供眉山服務(wù)器托管、成都服務(wù)器、成都主機托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價的產(chǎn)品以及開放、透明、穩(wěn)定、高性價比的服務(wù),資深網(wǎng)絡(luò)工程師在機房提供7*24小時標準級技術(shù)保障。本篇文章給大家?guī)淼膬?nèi)容是關(guān)于如何理解spring事務(wù)及聲明式事務(wù)的使用,包括數(shù)據(jù)庫中的事物隔離級別,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
spring事務(wù)及聲明式事務(wù)的使用(同學(xué)們,開始復(fù)習大學(xué)還給老師的數(shù)據(jù)庫知識啦?。。?/p>
事務(wù):訪問并可能更新數(shù)據(jù)庫中各種數(shù)據(jù)項的一個程序執(zhí)行單元(unit)。
事務(wù)有四個屬性:(ACID)
原子性:一個事務(wù)是一個不可分割的工作單元,事務(wù)中包括的諸操作要么都做,要么都不做。
一致性;事務(wù)必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。一致性與原子性使密切相關(guān)的。
隔離性:一個事務(wù)的執(zhí)行不能被其他事物干擾。即一個事務(wù)內(nèi)部操作及使用的數(shù)據(jù)對并發(fā)的其他事物是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能相互干擾。
持久性:持久性也稱永久性,指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該永久的。
事務(wù)目的:為了使數(shù)據(jù)保持一致性和完整性。
一致性:一個業(yè)務(wù)鏈的數(shù)據(jù)狀態(tài)是一致的,不能部分改變部分不改變。
完整性:一個業(yè)務(wù)鏈的數(shù)據(jù)是完整的,要么一起完成一起失敗,不能部分寫入成功,部分寫入失敗。
簡單理解事務(wù)的一致性和完整性就是要么一起活,要么一起死,不能獨活。(像是凄慘的愛情…………^?_?^)
數(shù)據(jù)庫中的事物隔離級別在了解事務(wù)隔離級別之前,先來了解一下數(shù)據(jù)中經(jīng)常發(fā)生的可能導(dǎo)致業(yè)務(wù)邏輯失敗的幾種情況。
臟讀當一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進行了修改,并且還沒有提交到數(shù)據(jù)庫中;這時另一事務(wù)也訪問了這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。
例如:張三的銀行賬戶現(xiàn)在有1000,現(xiàn)在張三存入了200,那么在張三點擊提交的時候,他媳婦(辛苦的張三在給媳婦存零花錢)在商場購物花了500。張三查看余額發(fā)現(xiàn)只有500了(張三懵逼了。。)。然后兩人為了200吵了起來。以上就是脹讀引起一場家庭大戰(zhàn)。
不可重復(fù)讀不可重復(fù)讀:一個事務(wù)內(nèi),多次讀同一個數(shù)據(jù)。在這個事務(wù)還沒有結(jié)束時,另一個事務(wù)也訪問了該數(shù)據(jù)。在第一個事務(wù)的兩次讀數(shù)據(jù)間,由于第二個事務(wù)的修改,第一事務(wù)兩次讀到的數(shù)據(jù)可能不一樣。這樣就發(fā)生了一個事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的。(即不能讀到相同的數(shù)據(jù))
幻讀一個事務(wù)對一個表中的數(shù)據(jù)進行了修改,這種修改涉及到表中的全部數(shù)據(jù)行,與此同時第二個事務(wù)向表中插入一行新數(shù)據(jù)。就會發(fā)生操作第一個事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行。就好像發(fā)生了幻覺一樣。
spring的五種隔離級別ISOLATION_DEFAULT表示底層數(shù)據(jù)庫的默認隔離級別,對大部分數(shù)據(jù)庫而言通常值是:ISOLATION _READ _COMMITTED
ISOLATION _READ _UNCOMMITTED表示一個事務(wù)可以讀取另一事務(wù)修改但還沒有提交的數(shù)據(jù),不能防止臟讀和不可重復(fù)讀。
ISOLATION _READ _COMMITTED一個事務(wù)只能讀取另一個事務(wù)已經(jīng)提交的數(shù)據(jù),可以防止臟讀,但是不能防止不可重復(fù)讀。(大多數(shù)情況的推薦值)
ISOLATION _REPEATABLE _READ一個事務(wù)在整個過程中可以多次重復(fù)執(zhí)行某個查詢,并且每次返回的記錄都相同。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢,這些新增的記錄也會被忽略??梢苑乐古K讀和不可重復(fù)讀。
ISOLATION _SERIALIZBLE所有事務(wù)依次逐個執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾。可以防止臟讀,不可重復(fù)讀,幻讀。
事務(wù)的傳播性(spring提供了七個)是指事務(wù)之間的關(guān)系,例如一個事務(wù)中含有另一個事務(wù),那么傳播性用來確定相互的執(zhí)行。
TransationDefinition.PROPAGETION.REQUIRED如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則創(chuàng)建一個新的事務(wù)。
spring中的默認事務(wù)。適合絕大多數(shù)情況。
創(chuàng)建一個新的事務(wù),如果當前存在事務(wù),則把當前事務(wù)掛起。
意思是創(chuàng)建一個新的事務(wù),和原來的事務(wù)沒有任何關(guān)系。
如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運行。
這種方式非常隨意,沒有就沒有,有就有,有點無所謂的態(tài)度。
以非事務(wù)的方式運行,如果當前存在事務(wù),則把當前事務(wù)掛起。
這種方式非常強硬,沒有就沒有,有也不支持,掛起來,不管它。
以非事務(wù)的方式運行,如果當前存在事務(wù),則拋出異常。
這種方式更加強硬,沒有就沒有,有反而報錯,他對大家宣稱:我從不支持事務(wù)。
如果當前存在事務(wù),則加入該事務(wù);如果當前沒有事務(wù),則拋出異常。
這種方式可以說是最強硬的,沒有事務(wù)就直接報錯,它對全世界說:我必須要有事務(wù)。
如果當前存在事務(wù),則創(chuàng)建一個事務(wù)作為當前事務(wù)的嵌套事務(wù)來運行;如果當前沒有事務(wù),則該取值等價于
TransationDefinition.PROPAGETION_REQUIRED
現(xiàn)在來看在springboot中,如果使用聲明式事務(wù):
@Transactional public void save(Object ob){ }
只要在方法上增加@Transactional注解方法就可以被事務(wù)管理起來。
源碼看一下注解Transactional的源碼:
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; boolean readOnly() default false; Class extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }默認值
readOnly : 是否僅僅只讀。默認讀寫都可以
timeout : 事務(wù)超時時間,默認沒有超時時間
isolation: 事務(wù)的隔離級別 默認:TransactionDefinition.ISOLATION_DEFAULT(見上文隔離級別)
propagation :事務(wù)的傳播屬性 默認:TransactionDefinition.PROPAGATION_REQUIRED
注意事項注解應(yīng)該只被應(yīng)用到public方法上
自調(diào)用問題:如果類中沒有注解方法調(diào)用有注解的方法,那么外部在調(diào)用沒有注解的方法時,有注解的方法不會產(chǎn)生事務(wù)
以上是spring事務(wù)及聲明式事務(wù)的使用方法的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)網(wǎng)站制作公司行業(yè)資訊頻道!