![spring事務(wù)處理很重要_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/8da5feaa-5502-483a-acbc-10d1d351d345/8da5feaa-5502-483a-acbc-10d1d351d3451.gif)
![spring事務(wù)處理很重要_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/8da5feaa-5502-483a-acbc-10d1d351d345/8da5feaa-5502-483a-acbc-10d1d351d3452.gif)
![spring事務(wù)處理很重要_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/8da5feaa-5502-483a-acbc-10d1d351d345/8da5feaa-5502-483a-acbc-10d1d351d3453.gif)
![spring事務(wù)處理很重要_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/8da5feaa-5502-483a-acbc-10d1d351d345/8da5feaa-5502-483a-acbc-10d1d351d3454.gif)
![spring事務(wù)處理很重要_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/10/8da5feaa-5502-483a-acbc-10d1d351d345/8da5feaa-5502-483a-acbc-10d1d351d3455.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、事物管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,好使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性。spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式。 編程式事務(wù)管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于編程式事務(wù)管理,spring推薦使用TransactionTemplate。 聲明式事務(wù)管理建立在AOP之上的。其本質(zhì)是對方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。聲明式事務(wù)最大的優(yōu)點(diǎn)就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理
2、的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或通過基于Transactional注解的方式),便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。 顯然聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,這正是spring倡導(dǎo)的非侵入式的開發(fā)方式。聲明式事務(wù)管理使業(yè)務(wù)代碼不受污染,一個(gè)普通的POJO對象,只要加上注解就可以獲得完全的事務(wù)支持。和編程式事務(wù)相比,聲明式事務(wù)唯一不足地方是,后者的最細(xì)粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進(jìn)行事務(wù)管理的代碼塊獨(dú)立為方法等等。 聲明式事務(wù)管理也有兩種常用的方式,一種是基于tx和aop名字空間的
3、xml配置文件,另一種就是基于Transactional注解。顯然基于注解的方式更簡單易用,更清爽。spring事務(wù)特性spring所有的事務(wù)管理策略類都繼承自org.springframework.transaction.PlatformTransactionManager接口其中TransactionDefinition接口定義以下特性:事務(wù)隔離級別 隔離級別是指若干個(gè)并發(fā)的事務(wù)之間的隔離程度。TransactionDefinition 接口中定義了五個(gè)表示隔離級別的常量: TransactionDefinition.ISOLATION_DEFAULT:這是默認(rèn)值,表示使用底層數(shù)據(jù)庫的默認(rèn)
4、隔離級別。對大部分?jǐn)?shù)據(jù)庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。 TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個(gè)事務(wù)可以讀取另一個(gè)事務(wù)修改但還沒有提交的數(shù)據(jù)。該級別不能防止臟讀,不可重復(fù)讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實(shí)際上并沒有此級別。 TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個(gè)事務(wù)只能讀取另一個(gè)事務(wù)已經(jīng)提交的數(shù)據(jù)。該級別可以防止臟讀,這也是大多數(shù)情況下的推
5、薦值。 TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個(gè)事務(wù)在整個(gè)過程中可以多次重復(fù)執(zhí)行某個(gè)查詢,并且每次返回的記錄都相同。該級別可以防止臟讀和不可重復(fù)讀。 TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務(wù)依次逐個(gè)執(zhí)行,這樣事務(wù)之間就完全不可能產(chǎn)生干擾,也就是說,該級別可以防止臟讀、不可重復(fù)讀以及幻讀。但是這將嚴(yán)重影響程序的性能。通常情況下也不會用到該級別。事務(wù)傳播行為 所謂事務(wù)的傳播行為是指,如果在開始當(dāng)前事務(wù)之前,一個(gè)事務(wù)上下文已經(jīng)存在,此時(shí)有若干選項(xiàng)可以指定一個(gè)事務(wù)性方法
6、的執(zhí)行行為。在TransactionDefinition定義中包括了如下幾個(gè)表示傳播行為的常量: TransactionDefinition.PROPAGATION_REQUIRED:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。這是默認(rèn)值。 TransactionDefinition.PROPAGATION_REQUIRES_NEW:創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。 TransactionDefinition.PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。 Transacti
7、onDefinition.PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。 TransactionDefinition.PROPAGATION_NEVER:以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。 TransactionDefinition.PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。 TransactionDefinition.PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)作為當(dāng)前事務(wù)的嵌套事務(wù)來運(yùn)行;如果當(dāng)前沒有事務(wù),則該取值等價(jià)于Tran
8、sactionDefinition.PROPAGATION_REQUIRED。事務(wù)超時(shí) 所謂事務(wù)超時(shí),就是指一個(gè)事務(wù)所允許執(zhí)行的最長時(shí)間,如果超過該時(shí)間限制但事務(wù)還沒有完成,則自動回滾事務(wù)。在 TransactionDefinition 中以 int 的值來表示超時(shí)時(shí)間,其單位是秒。 默認(rèn)設(shè)置為底層事務(wù)系統(tǒng)的超時(shí)值,如果底層數(shù)據(jù)庫事務(wù)系統(tǒng)沒有設(shè)置超時(shí)值,那么就是none,沒有超時(shí)限制。事務(wù)只讀屬性 只讀事務(wù)用于客戶代碼只讀但不修改數(shù)據(jù)的情形,只讀事務(wù)用于特定情景下的優(yōu)化,比如使用Hibernate的時(shí)候。默認(rèn)為讀寫事務(wù)。 “只讀事務(wù)”并不是一個(gè)強(qiáng)制選項(xiàng),它只是一個(gè)“暗示”,提示數(shù)據(jù)庫驅(qū)動程序和
9、數(shù)據(jù)庫系統(tǒng),這個(gè)事務(wù)并不包含更改數(shù)據(jù)的操作,那么JDBC驅(qū)動程序和數(shù)據(jù)庫就有可能根據(jù)這種情況對該事務(wù)進(jìn)行一些特定的優(yōu)化,比方說不安排相應(yīng)的數(shù)據(jù)庫鎖,以減輕事務(wù)對數(shù)據(jù)庫的壓力,畢竟事務(wù)也是要消耗數(shù)據(jù)庫的資源的。但是你非要在“只讀事務(wù)”里面修改數(shù)據(jù),也并非不可以,只不過對于數(shù)據(jù)一致性的保護(hù)不像“讀寫事務(wù)”那樣保險(xiǎn)而已。因此,“只讀事務(wù)”僅僅是一個(gè)性能優(yōu)化的推薦配置而已,并非強(qiáng)制你要這樣做不可spring事務(wù)回滾規(guī)則 指示spring事務(wù)管理器回滾一個(gè)事務(wù)的推薦方法是在當(dāng)前事務(wù)的上下文內(nèi)拋出異常。spring事務(wù)管理器會捕捉任何未處理的異常,然后依據(jù)規(guī)則決定是否回滾拋出異常的事務(wù)。 默認(rèn)配置下,sp
10、ring只有在拋出的異常為運(yùn)行時(shí)unchecked異常時(shí)才回滾該事務(wù),也就是拋出的異常為RuntimeException的子類(Errors也會導(dǎo)致事務(wù)回滾),而拋出checked異常則不會導(dǎo)致事務(wù)回滾??梢悦鞔_的配置在拋出那些異常時(shí)回滾事務(wù),包括checked異常。也可以明確定義那些異常拋出時(shí)不回滾事務(wù)。還可以編程性的通過setRollbackOnly()方法來指示一個(gè)事務(wù)必須回滾,在調(diào)用完setRollbackOnly()后你所能執(zhí)行的唯一操作就是回滾。 myBatis為例 基于注解的聲明式事務(wù)管理配置Transactionalspring.xmlhtml view plain copyp
11、rint?1. 2. 3. 4. 5. classpath:mybatis-config.xml6. 7. 8. 9. 10. 11. 12. 13. com.baobao.persistence.test14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. classpath:mybatis-config.xmlcom.baobao.persistence.test添加tx名字空間html view plain copyprint?1. xmlns:aop=/schema/aopxmlns:t
12、x=/schema/tx2. 3. xsi:schemaLocation=/schema/aop/schema/aop/spring-aop-3.0.xsd4. /schema/tx/schema/tx/spring-tx-3.0.xsdxmlns:aop=http:/www.springframework.
13、org/schema/aop xmlns:tx=/schema/txxsi:schemaLocation=/schema/aop /schema/aop/spring-aop-3.0.xsd /schema/tx /schema/tx/spring-tx-3.0.xsd MyBatis自動參與到spring事
14、務(wù)管理中,無需額外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的數(shù)據(jù)源與DataSourceTransactionManager引用的數(shù)據(jù)源一致即可,否則事務(wù)管理會不起作用。Transactional注解Transactional屬性屬性類型描述valueString可選的限定描述符,指定使用的事務(wù)管理器propagationenum: Propagation可選的事務(wù)傳播行為設(shè)置isolationenum: Isolation可選的事務(wù)隔離級別設(shè)置readOnlyboolean讀寫或只讀事務(wù),默認(rèn)讀寫timeoutint (in second
15、s granularity)事務(wù)超時(shí)時(shí)間設(shè)置rollbackForClass對象數(shù)組,必須繼承自Throwable導(dǎo)致事務(wù)回滾的異常類數(shù)組rollbackForClassName類名數(shù)組,必須繼承自Throwable導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù)組noRollbackForClass對象數(shù)組,必須繼承自Throwable不會導(dǎo)致事務(wù)回滾的異常類數(shù)組noRollbackForClassName類名數(shù)組,必須繼承自Throwable不會導(dǎo)致事務(wù)回滾的異常類名字?jǐn)?shù)組用法 Transactional 可以作用于接口、接口方法、類以及類方法上。當(dāng)作用于類上時(shí),該類的所有 public 方法將都具有該類型的事
16、務(wù)屬性,同時(shí),我們也可以在方法級別使用該標(biāo)注來覆蓋類級別的定義。 雖然 Transactional 注解可以作用于接口、接口方法、類以及類方法上,但是 Spring 建議不要在接口或者接口方法上使用該注解,因?yàn)檫@只有在使用基于接口的代理時(shí)它才會生效。另外, Transactional 注解應(yīng)該只被應(yīng)用到 public 方法上,這是由 Spring AOP 的本質(zhì)決定的。如果你在 protected、private 或者默認(rèn)可見性的方法上使用 Transactional 注解,這將被忽略,也不會拋出任何異常。 默認(rèn)情況下,只有來自外部的方法調(diào)用才會被AOP代理捕獲,也就是,類內(nèi)部方法調(diào)用本類內(nèi)部
17、的其他方法并不會引起事務(wù)行為,即使被調(diào)用方法使用Transactional注解進(jìn)行修飾。java view plain copyprint?1. Autowired2. privateMyBatisDaodao;3. 4. Transactional5. Override6. publicvoidinsert(Testtest)7. dao.insert(test);8. thrownewRuntimeException(test);/拋出unchecked異常,觸發(fā)事物,回滾9. Autowiredprivate MyBatisDao dao;TransactionalOverridepub
18、lic void insert(Test test) dao.insert(test);throw new RuntimeException(test);/拋出unchecked異常,觸發(fā)事物,回滾noRollbackForjava view plain copyprint?1. Transactional(noRollbackFor=RuntimeException.class)2. Override3. publicvoidinsert(Testtest)4. dao.insert(test);5. /拋出unchecked異常,觸發(fā)事物,noRollbackFor=RuntimeExce
19、ption.class,不回滾6. thrownewRuntimeException(test);7. Transactional(noRollbackFor=RuntimeException.class)Overridepublic void insert(Test test) dao.insert(test);/拋出unchecked異常,觸發(fā)事物,noRollbackFor=RuntimeException.class,不回滾throw new RuntimeException(test);類,當(dāng)作用于類上時(shí),該類的所有 public 方法將都具有該類型的事務(wù)屬性java view pl
20、ain copyprint?1. Transactional2. publicclassMyBatisServiceImplimplementsMyBatisService3. 4. Autowired5. privateMyBatisDaodao;6. 7. 8. Override9. publicvoidinsert(Testtest)10. dao.insert(test);11. /拋出unchecked異常,觸發(fā)事物,回滾12. thrownewRuntimeException(test);13. Transactionalpublic class MyBatisServiceImp
21、l implements MyBatisService Autowiredprivate MyBatisDao dao;Overridepublic void insert(Test test) dao.insert(test);/拋出unchecked異常,觸發(fā)事物,回滾throw new RuntimeException(test);propagation=Propagation.NOT_SUPPORTEDjava view plain copyprint?1. Transactional(propagation=Propagation.NOT_SUPPORTED)2. Override3
22、. publicvoidinsert(Testtest)4. /事物傳播行為是PROPAGATION_NOT_SUPPORTED,以非事務(wù)方式運(yùn)行,不會存入數(shù)據(jù)庫5. dao.insert(test);6. Transactional(propagation=Propagation.NOT_SUPPORTED)Overridepublic void insert(Test test) /事物傳播行為是PROPAGATION_NOT_SUPPORTED,以非事務(wù)方式運(yùn)行,不會存入數(shù)據(jù)庫dao.insert(test); myBatis為例 基于注解的聲明式事務(wù)管理配置,xml配置主要為aop切面
23、配置,只看xml就可以了html view plain copyprint?1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 1、spring事務(wù)控制放在service層,在service方法中一個(gè)方法調(diào)用service中的另一個(gè)方法,默認(rèn)開啟幾個(gè)事務(wù)? spring的事務(wù)傳播方式默認(rèn)是PROPAGATION_REQUIRED,判斷當(dāng)前是否已開啟一個(gè)新事務(wù),有則加入當(dāng)前事務(wù),否則新開一個(gè)事務(wù)(如果沒有就開啟一個(gè)新事務(wù)),所以答案是開啟了一個(gè)事務(wù)。2、spring 什么情況下進(jìn)行事務(wù)回滾? Spring、EJB的聲明式事務(wù)默認(rèn)情況下都是在拋出unchecked exc
24、eption后才會觸發(fā)事務(wù)的回滾 unchecked異常,即運(yùn)行時(shí)異常runntimeException 回滾事務(wù); checked異常,即Exception可try捕獲的不會回滾.當(dāng)然也可配置spring參數(shù)讓其回滾. spring的事務(wù)邊界是在調(diào)用業(yè)務(wù)方法之前開始的,業(yè)務(wù)方法執(zhí)行完畢之后來執(zhí)行commit or rollback(Spring默認(rèn)取決于是否拋出runtime異常). 如果拋出runtime exception 并在你的業(yè)務(wù)方法中沒有catch到的話,事務(wù)會回滾。 一般不需要在業(yè)務(wù)方法中catch異常,如果非要catch,在做完你想做的工作后(比如關(guān)閉文件等)一定要拋出run
25、time exception,否則spring會將你的操作commit,這樣就會產(chǎn)生 臟數(shù)據(jù).所以你的catch代碼是畫蛇添足。數(shù)據(jù)庫事務(wù)和Spring事務(wù)是一般面試都會被提到,很多朋友寫慣了代碼,很少花時(shí)間去整理歸納這些東西,結(jié)果本來會的東西,居然吞吞吐吐答不上來。下面是我收集到一些關(guān)于Spring事務(wù)的問題,希望能幫助大家過關(guān)。事務(wù)是邏輯處理原子性的保證手段,通過使用事務(wù)控制,可以極大的避免出現(xiàn)邏輯處理失敗導(dǎo)致的臟數(shù)據(jù)等問題。事務(wù)最重要的兩個(gè)特性,是事務(wù)的傳播級別和數(shù)據(jù)隔離級別。傳播級別定義的是事務(wù)的控制范圍,事務(wù)隔離級別定義的是事務(wù)在數(shù)據(jù)庫讀寫方面的控制范圍。事務(wù)的7種傳播級別:1) P
26、ROPAGATION_REQUIRED ,默認(rèn)的spring事務(wù)傳播級別,使用該級別的特點(diǎn)是,如果上下文中已經(jīng)存在事務(wù),那么就加入到事務(wù)中執(zhí)行,如果當(dāng)前上下文中不存在事務(wù),則新建事務(wù)執(zhí)行。所以這個(gè)級別通常能滿足處理大多數(shù)的業(yè)務(wù)場景。2)PROPAGATION_SUPPORTS ,從字面意思就知道,supports,支持,該傳播級別的特點(diǎn)是,如果上下文存在事務(wù),則支持事務(wù)加入事務(wù),如果沒有事務(wù),則使用非事務(wù)的方式執(zhí)行。所以說,并非所有的包在transactionTemplate.execute中的代碼都會有事務(wù)支持。這個(gè)通常是用來處理那些并非原子性的非核心業(yè)務(wù)邏輯操作。應(yīng)用場景較少。3)PROP
27、AGATION_MANDATORY , 該級別的事務(wù)要求上下文中必須要存在事務(wù),否則就會拋出異常!配置該方式的傳播級別是有效的控制上下文調(diào)用代碼遺漏添加事務(wù)控制的保證手段。比如一段代碼不能單獨(dú)被調(diào)用執(zhí)行,但是一旦被調(diào)用,就必須有事務(wù)包含的情況,就可以使用這個(gè)傳播級別。4)PROPAGATION_REQUIRES_NEW ,從字面即可知道,new,每次都要一個(gè)新事務(wù),該傳播級別的特點(diǎn)是,每次都會新建一個(gè)事務(wù),并且同時(shí)將上下文中的事務(wù)掛起,執(zhí)行當(dāng)前新建事務(wù)完成以后,上下文事務(wù)恢復(fù)再執(zhí)行。這是一個(gè)很有用的傳播級別,舉一個(gè)應(yīng)用場景:現(xiàn)在有一個(gè)發(fā)送100個(gè)紅包的操作,在發(fā)送之前,要做一些系統(tǒng)的初始化、驗(yàn)
28、證、數(shù)據(jù)記錄操作,然后發(fā)送100封紅包,然后再記錄發(fā)送日志,發(fā)送日志要求100%的準(zhǔn)確,如果日志不準(zhǔn)確,那么整個(gè)父事務(wù)邏輯需要回滾。怎么處理整個(gè)業(yè)務(wù)需求呢?就是通過這個(gè)PROPAGATION_REQUIRES_NEW 級別的事務(wù)傳播控制就可以完成。發(fā)送紅包的子事務(wù)不會直接影響到父事務(wù)的提交和回滾。5)PROPAGATION_NOT_SUPPORTED ,這個(gè)也可以從字面得知,not supported ,不支持,當(dāng)前級別的特點(diǎn)就是上下文中存在事務(wù),則掛起事務(wù),執(zhí)行當(dāng)前邏輯,結(jié)束后恢復(fù)上下文的事務(wù)。這個(gè)級別有什么好處?可以幫助你將事務(wù)極可能的縮小。我們知道一個(gè)事務(wù)越大,它存在的風(fēng)險(xiǎn)也就越多。所以
29、在處理事務(wù)的過程中,要保證盡可能的縮小范圍。比如一段代碼,是每次邏輯操作都必須調(diào)用的,比如循環(huán)1000次的某個(gè)非核心業(yè)務(wù)邏輯操作。這樣的代碼如果包在事務(wù)中,勢必造成事務(wù)太大,導(dǎo)致出現(xiàn)一些難以考慮周全的異常情況。所以這個(gè)事務(wù)這個(gè)級別的傳播級別就派上用場了。用當(dāng)前級別的事務(wù)模板抱起來就可以了。6)PROPAGATION_NEVER ,該事務(wù)更嚴(yán)格,上面一個(gè)事務(wù)傳播級別只是不支持而已,有事務(wù)就掛起,而PROPAGATION_NEVER傳播級別要求上下文中不能存在事務(wù),一旦有事務(wù),就拋出runtime異常,強(qiáng)制停止執(zhí)行!這個(gè)級別上輩子跟事務(wù)有仇。7)PROPAGATION_NESTED ,字面也可知道
30、,nested,嵌套級別事務(wù)。該傳播級別特征是,如果上下文中存在事務(wù),則嵌套事務(wù)執(zhí)行,如果不存在事務(wù),則新建事務(wù)。那么什么是嵌套事務(wù)呢?很多人都不理解,我看過一些博客,都是有些理解偏差。嵌套是子事務(wù)套在父事務(wù)中執(zhí)行,子事務(wù)是父事務(wù)的一部分,在進(jìn)入子事務(wù)之前,父事務(wù)建立一個(gè)回滾點(diǎn),叫save point,然后執(zhí)行子事務(wù),這個(gè)子事務(wù)的執(zhí)行也算是父事務(wù)的一部分,然后子事務(wù)執(zhí)行結(jié)束,父事務(wù)繼續(xù)執(zhí)行。重點(diǎn)就在于那個(gè)save point。看幾個(gè)問題就明了了:如果子事務(wù)回滾,會發(fā)生什么?父事務(wù)會回滾到進(jìn)入子事務(wù)前建立的save point,然后嘗試其他的事務(wù)或者其他的業(yè)務(wù)邏輯,父事務(wù)之前的操作不會受到影響,
31、更不會自動回滾。如果父事務(wù)回滾,會發(fā)生什么?父事務(wù)回滾,子事務(wù)也會跟著回滾!為什么呢,因?yàn)楦甘聞?wù)結(jié)束之前,子事務(wù)是不會提交的,我們說子事務(wù)是父事務(wù)的一部分,正是這個(gè)道理。那么:事務(wù)的提交,是什么情況?是父事務(wù)先提交,然后子事務(wù)提交,還是子事務(wù)先提交,父事務(wù)再提交?答案是第二種情況,還是那句話,子事務(wù)是父事務(wù)的一部分,由父事務(wù)統(tǒng)一提交。現(xiàn)在你再體會一下這個(gè)”嵌套“,是不是有那么點(diǎn)意思?以上是事務(wù)的7個(gè)傳播級別,在日常應(yīng)用中,通??梢詽M足各種業(yè)務(wù)需求,但是除了傳播級別,在讀取數(shù)據(jù)庫的過程中,如果兩個(gè)事務(wù)并發(fā)執(zhí)行,那么彼此之間的數(shù)據(jù)是如何影響的呢?這就需要了解一下事務(wù)的另一個(gè)特性:數(shù)據(jù)隔離級別數(shù)據(jù)隔
32、離級別分為不同的四種:1、Serializable :最嚴(yán)格的級別,事務(wù)串行執(zhí)行,資源消耗最大;2、REPEATABLE READ :保證了一個(gè)事務(wù)不會修改已經(jīng)由另一個(gè)事務(wù)讀取但未提交(回滾)的數(shù)據(jù)。避免了“臟讀取”和“不可重復(fù)讀取”的情況,但是帶來了更多的性能損失。3、READ COMMITTED :大多數(shù)主流數(shù)據(jù)庫的默認(rèn)事務(wù)等級,保證了一個(gè)事務(wù)不會讀到另一個(gè)并行事務(wù)已修改但未提交的數(shù)據(jù),避免了“臟讀取”。該級別適用于大多數(shù)系統(tǒng)。4、Read Uncommitted :保證了讀取過程中不會讀取到非法數(shù)據(jù)。上面的解釋其實(shí)每個(gè)定義都有一些拗口,其中涉及到幾個(gè)術(shù)語:臟讀、不可重復(fù)讀、幻讀。這里解釋
33、一下:臟讀 :所謂的臟讀,其實(shí)就是讀到了別的事務(wù)回滾前的臟數(shù)據(jù)。比如事務(wù)B執(zhí)行過程中修改了數(shù)據(jù)X,在未提交前,事務(wù)A讀取了X,而事務(wù)B卻回滾了,這樣事務(wù)A就形成了臟讀。不可重復(fù)讀 :不可重復(fù)讀字面含義已經(jīng)很明了了,比如事務(wù)A首先讀取了一條數(shù)據(jù),然后執(zhí)行邏輯的時(shí)候,事務(wù)B將這條數(shù)據(jù)改變了,然后事務(wù)A再次讀取的時(shí)候,發(fā)現(xiàn)數(shù)據(jù)不匹配了,就是所謂的不可重復(fù)讀了?;米x :小的時(shí)候數(shù)手指,第一次數(shù)十10個(gè),第二次數(shù)是11個(gè),怎么回事?產(chǎn)生幻覺了?幻讀也是這樣子,事務(wù)A首先根據(jù)條件索引得到10條數(shù)據(jù),然后事務(wù)B改變了數(shù)據(jù)庫一條數(shù)據(jù),導(dǎo)致也符合事務(wù)A當(dāng)時(shí)的搜索條件,這樣事務(wù)A再次搜索發(fā)現(xiàn)有11條數(shù)據(jù)了,就產(chǎn)生
34、了幻讀。一個(gè)對照關(guān)系表: Dirty reads non-repeatable reads phantom readsSerializable 不會 不會 不會REPEATABLE READ 不會 不會 會READ COMMITTED 不會 會 會Read Uncommitted 會 會 會所以最安全的,是Serializable,但是伴隨而來也是高昂的性能開銷。另外,事務(wù)常用的兩個(gè)屬性:readonly和timeout一個(gè)是設(shè)置事務(wù)為只讀以提升性能。另一個(gè)是設(shè)置事務(wù)的超時(shí)時(shí)間,一般用于防止大事務(wù)的發(fā)生。還是那句話,事務(wù)要盡可能的?。∽詈笠胍粋€(gè)問題:一個(gè)邏輯操作需要檢查的條件有20條,能否為了減小
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 28海的女兒說課稿-2023-2024學(xué)年四年級下冊語文統(tǒng)編版
- 2 我是什么(說課稿)-2024-2025學(xué)年統(tǒng)編版語文二年級上冊
- 2024-2025學(xué)年高中生物 專題2 微生物的培養(yǎng)與應(yīng)用 課題2 土壤中分解尿素的細(xì)菌的分離與計(jì)數(shù)說課稿3 新人教版選修1
- 2025國有土地使用權(quán)出讓協(xié)議合同
- 2025有限公司股權(quán)轉(zhuǎn)讓合同
- Module 1 Unit 2 Changes in our lives Listen and say Listen and enjoy (說課稿)-2024-2025學(xué)年滬教牛津版(深圳用)英語六年級下冊
- 2025城市供用氣合同
- 加氣轎車出售合同范例
- 8《安全記心上》(第一課時(shí))說課稿-2024-2025學(xué)年道德與法治三年級上冊統(tǒng)編版
- 倉儲框架合同范例
- 2025年中國X線診斷設(shè)備行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 2024版全文:中國2型糖尿病預(yù)防及治療指南
- 讀書心得《好老師征服后進(jìn)生的14堂課》讀后感
- 公路工程施工安全應(yīng)急預(yù)案(4篇)
- 社會主義發(fā)展史(齊魯師范學(xué)院)知到智慧樹章節(jié)答案
- 工程回訪記錄單
- 住房公積金投訴申請書
- 高考物理二輪專題課件:“配速法”解決擺線問題
- 檢驗(yàn)科生物安全風(fēng)險(xiǎn)評估報(bào)告
- 京頤得移動門診產(chǎn)品輸液
- 如何做一名合格的帶教老師PPT精選文檔
評論
0/150
提交評論