明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

怎么理解spring事務及聲明式事務的使用

[摘要]本篇文章給大家?guī)淼膬?nèi)容是關(guān)于如何理解spring事務及聲明式事務的使用,包括數(shù)據(jù)庫中的事物隔離級別,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。spring事務及聲明式事務的使用...

本篇文章給大家?guī)淼膬?nèi)容是關(guān)于如何理解spring事務及聲明式事務的使用,包括數(shù)據(jù)庫中的事物隔離級別,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

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

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

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

事務有四個屬性:(ACID)

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

一致性;事務必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。一致性與原子性使密切相關(guān)的。

隔離性:一個事務的執(zhí)行不能被其他事物干擾。即一個事務內(nèi)部操作及使用的數(shù)據(jù)對并發(fā)的其他事物是隔離的,并發(fā)執(zhí)行的各個事務之間不能相互干擾。

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

事務目的:為了使數(shù)據(jù)保持一致性和完整性。

一致性:一個業(yè)務鏈的數(shù)據(jù)狀態(tài)是一致的,不能部分改變部分不改變。

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

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

數(shù)據(jù)庫中的事物隔離級別

在了解事務隔離級別之前,先來了解一下數(shù)據(jù)中經(jīng)常發(fā)生的可能導致業(yè)務邏輯失敗的幾種情況。

臟讀

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

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

不可重復讀

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

幻讀

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

spring的五種隔離級別

ISOLATION_DEFAULT

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

ISOLATION _READ _UNCOMMITTED

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

ISOLATION _READ _COMMITTED

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

ISOLATION _REPEATABLE _READ

一個事務在整個過程中可以多次重復執(zhí)行某個查詢,并且每次返回的記錄都相同。即使在多次查詢之間有新增的數(shù)據(jù)滿足該查詢,這些新增的記錄也會被忽略?梢苑乐古K讀和不可重復讀。

ISOLATION _SERIALIZBLE

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

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

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

TransationDefinition.PROPAGETION.REQUIRED

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

TransationDefinition.PROPAGETION.REQUIRED_NEW

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

TransationDefinition.PROPAGETION.SUPPORTS

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

TransationDefinition.PROPAGATION.NOT_SUPPORTED

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

TransationDefinition.PROPAGETION_NEVER

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

TransationDefinition.PROPAGETION_MANDATORY

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

TransationDefinition.PROPAGETION_NESTED

如果當前存在事務,則創(chuàng)建一個事務作為當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價于
TransationDefinition.PROPAGETION_REQUIRED

聲明式事務

使用

現(xiàn)在來看在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方法上

  • 自調(diào)用問題:如果類中沒有注解方法調(diào)用有注解的方法,那么外部在調(diào)用沒有注解的方法時,有注解的方法不會產(chǎn)生事務

以上就是如何理解spring事務及聲明式事務的使用的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學習教程快速掌握從入門到精通的SQL知識。