中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

spring事務及聲明式事務的使用方法

發布時間:2020-09-14 14:22:13 來源:億速云 閱讀:143 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹spring事務及聲明式事務的使用方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

本篇文章給大家帶來的內容是關于如何理解spring事務及聲明式事務的使用,包括數據庫中的事物隔離級別,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

spring事務及聲明式事務的使用

(同學們,開始復習大學還給老師的數據庫知識啦!!)

事務:訪問并可能更新數據庫中各種數據項的一個程序執行單元(unit)。

事務有四個屬性:(ACID)

原子性:一個事務是一個不可分割的工作單元,事務中包括的諸操作要么都做,要么都不做。

一致性;事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性使密切相關的。

隔離性:一個事務的執行不能被其他事物干擾。即一個事務內部操作及使用的數據對并發的其他事物是隔離的,并發執行的各個事務之間不能相互干擾。

持久性:持久性也稱永久性,指一個事務一旦提交,它對數據庫中數據的改變就應該永久的。

事務目的:為了使數據保持一致性和完整性。

一致性:一個業務鏈的數據狀態是一致的,不能部分改變部分不改變。

完整性:一個業務鏈的數據是完整的,要么一起完成一起失敗,不能部分寫入成功,部分寫入失敗。

簡單理解事務的一致性和完整性就是要么一起活,要么一起死,不能獨活。(像是凄慘的愛情…………^?_?^)

數據庫中的事物隔離級別

在了解事務隔離級別之前,先來了解一下數據中經常發生的可能導致業務邏輯失敗的幾種情況。

臟讀

當一個事務正在訪問數據,并且對數據進行了修改,并且還沒有提交到數據庫中;這時另一事務也訪問了這個數據,然后使用了這個數據。

例如:張三的銀行賬戶現在有1000,現在張三存入了200,那么在張三點擊提交的時候,他媳婦(辛苦的張三在給媳婦存零花錢)在商場購物花了500。張三查看余額發現只有500了(張三懵逼了。。)。然后兩人為了200吵了起來。以上就是脹讀引起一場家庭大戰。

不可重復讀

不可重復讀:一個事務內,多次讀同一個數據。在這個事務還沒有結束時,另一個事務也訪問了該數據。在第一個事務的兩次讀數據間,由于第二個事務的修改,第一事務兩次讀到的數據可能不一樣。這樣就發生了一個事務內兩次讀到的數據是不一樣的。(即不能讀到相同的數據)

幻讀

一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行,與此同時第二個事務向表中插入一行新數據。就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行。就好像發生了幻覺一樣。

spring的五種隔離級別

ISOLATION_DEFAULT

表示底層數據庫的默認隔離級別,對大部分數據庫而言通常值是:ISOLATION _READ _COMMITTED

ISOLATION _READ _UNCOMMITTED

表示一個事務可以讀取另一事務修改但還沒有提交的數據,不能防止臟讀和不可重復讀。

ISOLATION _READ _COMMITTED

一個事務只能讀取另一個事務已經提交的數據,可以防止臟讀,但是不能防止不可重復讀。(大多數情況的推薦值)

ISOLATION _REPEATABLE _READ

一個事務在整個過程中可以多次重復執行某個查詢,并且每次返回的記錄都相同。即使在多次查詢之間有新增的數據滿足該查詢,這些新增的記錄也會被忽略。可以防止臟讀和不可重復讀。

ISOLATION _SERIALIZBLE

所有事務依次逐個執行,這樣事務之間就完全不可能產生干擾。可以防止臟讀,不可重復讀,幻讀。

事務的傳播性(spring提供了七個)

是指事務之間的關系,例如一個事務中含有另一個事務,那么傳播性用來確定相互的執行。

TransationDefinition.PROPAGETION.REQUIRED

如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
spring中的默認事務。適合絕大多數情況。

TransationDefinition.PROPAGETION.REQUIRED_NEW

創建一個新的事務,如果當前存在事務,則把當前事務掛起。
意思是創建一個新的事務,和原來的事務沒有任何關系。

TransationDefinition.PROPAGETION.SUPPORTS

如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
這種方式非常隨意,沒有就沒有,有就有,有點無所謂的態度。

TransationDefinition.PROPAGATION.NOT_SUPPORTED

以非事務的方式運行,如果當前存在事務,則把當前事務掛起。
這種方式非常強硬,沒有就沒有,有也不支持,掛起來,不管它。

TransationDefinition.PROPAGETION_NEVER

以非事務的方式運行,如果當前存在事務,則拋出異常。
這種方式更加強硬,沒有就沒有,有反而報錯,他對大家宣稱:我從不支持事務。

TransationDefinition.PROPAGETION_MANDATORY

如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
這種方式可以說是最強硬的,沒有事務就直接報錯,它對全世界說:我必須要有事務。

TransationDefinition.PROPAGETION_NESTED

如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于
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事務及聲明式事務的使用方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安顺市| 枣阳市| 微山县| 靖边县| 文化| 合江县| 滁州市| 二连浩特市| 吴旗县| 永平县| 公安县| 长海县| 山阴县| 泊头市| 阆中市| 滨州市| 华池县| 浙江省| 姚安县| 赤峰市| 鸡西市| 兰考县| 株洲县| 措美县| 灌阳县| 泸州市| 郓城县| 兴和县| 永登县| 罗江县| 山东省| 马公市| 揭阳市| 福州市| 景东| 廉江市| 萝北县| 军事| 嘉鱼县| 白河县| 凉城县|