怎么理解spring事務及聲明式事務的使用
發(fā)表時間:2023-07-10 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]本篇文章給大家?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
注意事項
以上就是如何理解spring事務及聲明式事務的使用的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
學習教程快速掌握從入門到精通的SQL知識。