您好,登錄后才能下訂單哦!
這篇文章主要介紹spring事務及聲明式事務的使用方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
本篇文章給大家帶來的內容是關于如何理解spring事務及聲明式事務的使用,包括數據庫中的事物隔離級別,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
(同學們,開始復習大學還給老師的數據庫知識啦!!)
事務:訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit)。
事務有四個屬性:(ACID)
原子性:一個事務是一個不可分割的工作單元,事務中包括的諸操作要么都做,要么都不做。
一致性;事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性使密切相關的。
隔離性:一個事務的執行不能被其他事物干擾。即一個事務內部操作及使用的數據對并發的其他事物是隔離的,并發執行的各個事務之間不能相互干擾。
持久性:持久性也稱永久性,指一個事務一旦提交,它對數據庫中數據的改變就應該永久的。
事務目的:為了使數據保持一致性和完整性。
一致性:一個業務鏈的數據狀態是一致的,不能部分改變部分不改變。
完整性:一個業務鏈的數據是完整的,要么一起完成一起失敗,不能部分寫入成功,部分寫入失敗。
簡單理解事務的一致性和完整性就是要么一起活,要么一起死,不能獨活。(像是凄慘的愛情…………^?_?^)
在了解事務隔離級別之前,先來了解一下數據中經常發生的可能導致業務邏輯失敗的幾種情況。
當一個事務正在訪問數據,并且對數據進行了修改,并且還沒有提交到數據庫中;這時另一事務也訪問了這個數據,然后使用了這個數據。
例如:張三的銀行賬戶現在有1000,現在張三存入了200,那么在張三點擊提交的時候,他媳婦(辛苦的張三在給媳婦存零花錢)在商場購物花了500。張三查看余額發現只有500了(張三懵逼了。。)。然后兩人為了200吵了起來。以上就是脹讀引起一場家庭大戰。
不可重復讀:一個事務內,多次讀同一個數據。在這個事務還沒有結束時,另一個事務也訪問了該數據。在第一個事務的兩次讀數據間,由于第二個事務的修改,第一事務兩次讀到的數據可能不一樣。這樣就發生了一個事務內兩次讀到的數據是不一樣的。(即不能讀到相同的數據)
一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行,與此同時第二個事務向表中插入一行新數據。就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行。就好像發生了幻覺一樣。
表示底層數據庫的默認隔離級別,對大部分數據庫而言通常值是:ISOLATION _READ _COMMITTED
表示一個事務可以讀取另一事務修改但還沒有提交的數據,不能防止臟讀和不可重復讀。
一個事務只能讀取另一個事務已經提交的數據,可以防止臟讀,但是不能防止不可重復讀。(大多數情況的推薦值)
一個事務在整個過程中可以多次重復執行某個查詢,并且每次返回的記錄都相同。即使在多次查詢之間有新增的數據滿足該查詢,這些新增的記錄也會被忽略。可以防止臟讀和不可重復讀。
所有事務依次逐個執行,這樣事務之間就完全不可能產生干擾。可以防止臟讀,不可重復讀,幻讀。
是指事務之間的關系,例如一個事務中含有另一個事務,那么傳播性用來確定相互的執行。
如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
spring中的默認事務。適合絕大多數情況。
創建一個新的事務,如果當前存在事務,則把當前事務掛起。
意思是創建一個新的事務,和原來的事務沒有任何關系。
如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
這種方式非常隨意,沒有就沒有,有就有,有點無所謂的態度。
以非事務的方式運行,如果當前存在事務,則把當前事務掛起。
這種方式非常強硬,沒有就沒有,有也不支持,掛起來,不管它。
以非事務的方式運行,如果當前存在事務,則拋出異常。
這種方式更加強硬,沒有就沒有,有反而報錯,他對大家宣稱:我從不支持事務。
如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
這種方式可以說是最強硬的,沒有事務就直接報錯,它對全世界說:我必須要有事務。
如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于
TransationDefinition.PROPAGETION_REQUIRED
現在來看在springboot中,如果使用聲明式事務:
@Transactional public void save(Object ob){ }
只要在方法上增加@Transactional注解方法就可以被事務管理起來。
看一下注解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 : 事務超時時間,默認沒有超時時間
isolation: 事務的隔離級別 默認:TransactionDefinition.ISOLATION_DEFAULT(見上文隔離級別)
propagation :事務的傳播屬性 默認:TransactionDefinition.PROPAGATION_REQUIRED
注解應該只被應用到public方法上
自調用問題:如果類中沒有注解方法調用有注解的方法,那么外部在調用沒有注解的方法時,有注解的方法不會產生事務
以上是spring事務及聲明式事務的使用方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。