這篇文章主要介紹Spring中事務(wù)控制的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元廣漢做網(wǎng)站,已為上家服務(wù),為廣漢各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
1.事務(wù)的概念
事務(wù)是一組操作的執(zhí)行單元,相對(duì)于數(shù)據(jù)庫(kù)的單條操作而言,事務(wù)管理的是一組SQL指令,如增刪改查等,事務(wù)的特性體現(xiàn)在事務(wù)內(nèi)包含的SQL指令必須全部執(zhí)行成功,如果其中一條指令發(fā)生錯(cuò)誤,那么整個(gè)事務(wù)內(nèi)的一組操作都要進(jìn)行回滾。
事務(wù)有四個(gè)特性:
原子性 Atomic ,事務(wù)是一個(gè)不可再拆分的最小單位,要么整個(gè)執(zhí)行,要么整個(gè)回滾.
一致性 Consistent,事務(wù)要保證數(shù)據(jù)庫(kù)整體數(shù)據(jù)的完整性和業(yè)務(wù)的數(shù)據(jù)的一致性,事務(wù)成功提交整體數(shù)據(jù)修改,事務(wù)錯(cuò)誤則回滾到數(shù)據(jù)回到原來(lái)的狀態(tài)。
隔離性 Isolate,兩個(gè)事務(wù)的執(zhí)行都是獨(dú)立的,事務(wù)之前不會(huì)相互影響,多個(gè)事務(wù)操作一個(gè)對(duì)象時(shí)會(huì)以串行等待的方式保證事務(wù)相互之間處于隔離。
持久性 Durable,一旦事務(wù)成功提交后,數(shù)據(jù)將會(huì)保存到數(shù)據(jù)庫(kù),不能再進(jìn)行回滾,以后的操作都將在當(dāng)前數(shù)據(jù)庫(kù)狀態(tài)上繼續(xù)進(jìn)行。
2.Spring中的事務(wù)控制方式
編程式事務(wù)管理
通過(guò)手動(dòng)編碼控制事務(wù)的邊界,可以實(shí)現(xiàn)細(xì)粒度的事務(wù)控制,一般用的較少。
聲明式事務(wù)管理
只需要在Spring中添加一些配置文件或者使用注解,即可實(shí)現(xiàn)將操作納入事務(wù)管理中,事務(wù)管理使用了Spring AOP,降低了代碼之間的耦合。
3.事務(wù)管理器
Spring中并沒(méi)有直接管理事務(wù),而是將管理事務(wù)委托給相應(yīng)的持久化機(jī)制提供的某個(gè)特定平臺(tái)的實(shí)現(xiàn)。
事務(wù)管理器實(shí)現(xiàn) | 目標(biāo) |
---|---|
org.springframework.jdbc.datasource.DataSourceTransactionManager | 在單一的JDBC Datasource中管理事務(wù) |
org.springframework.orm.hibernate5.HibernateTransactionManager | 當(dāng)持久化機(jī)制是hibernate時(shí),用它來(lái)管理事務(wù) |
org.springframework.jdo.JdoTransactionManager | 當(dāng)持久化機(jī)制是Jdo時(shí),用它來(lái)管理事務(wù) |
org.springframework.transaction.jta.JtaTransactionManager | 使用一個(gè)JTA實(shí)現(xiàn)來(lái)管理事務(wù)。在一個(gè)事務(wù)跨越多個(gè)資源時(shí)必須使用 |
org.springframework.orm.ojb.PersistenceBrokerTransactionManager | 當(dāng)apache的ojb用作持久化機(jī)制時(shí),用它來(lái)管理事務(wù) |
4.事務(wù)屬性簡(jiǎn)介
Spring關(guān)于事務(wù)的注解中有以下幾個(gè)屬性(部分)
@Transactional( readOnly = false, //讀寫事務(wù) timeout = -1, //超時(shí) noRollbackFor = ArithmeticException.class //遇到數(shù)學(xué)異常不回滾 isolation = Isolation.REPEATABLE_READ, //事務(wù)隔離級(jí)別 propagation = Propagation.REQUIRED //事務(wù)傳播規(guī)則 )
是否為只讀事務(wù):只讀事務(wù)不做任何修改,可以優(yōu)化查詢操作。
事務(wù)超時(shí)(單位為秒):事務(wù)的最長(zhǎng)持續(xù)時(shí)間,如果該時(shí)間內(nèi)事務(wù)一直沒(méi)有操作或回滾,則系統(tǒng)將自動(dòng)進(jìn)行回滾。-1表示不超時(shí),但最終實(shí)現(xiàn)需要由底層數(shù)據(jù)庫(kù)實(shí)現(xiàn)。
隔離級(jí)別:控制并發(fā)訪問(wèn)下數(shù)據(jù)庫(kù)的安全性。
傳播規(guī)則:定義事務(wù)方法和調(diào)用事務(wù)方法的方法之間的事務(wù)邊界。
5.事務(wù)傳播規(guī)則
傳播行為 | 意義 |
---|---|
REQUIRED | 業(yè)務(wù)方法需要在一個(gè)事務(wù)中運(yùn)行。如果方法運(yùn)行時(shí),已經(jīng)處在一個(gè)事務(wù)中,那么加入到該事務(wù),否則為自己創(chuàng)建一個(gè)新的事務(wù) |
NOT_SUPPORTED | 聲明方法不需要事務(wù)。如果方法沒(méi)有關(guān)聯(lián)到一個(gè)事務(wù),容器不會(huì)為它開(kāi)啟事務(wù)。如果方法在一個(gè)事務(wù)中被調(diào)用,該事務(wù)會(huì)被掛起,在方法調(diào)用結(jié)束后,原先的事務(wù)便會(huì)恢復(fù)執(zhí)行 |
REQUIRES_NEW | 屬性表明不管是否存在事務(wù),業(yè)務(wù)方法總會(huì)為自己發(fā)起一個(gè)新的事務(wù)。如果方法已經(jīng)運(yùn)行在一個(gè)事務(wù)中,則原有事務(wù)會(huì)被掛起,新的事務(wù)會(huì)被創(chuàng)建,直到方法執(zhí)行結(jié)束,新事務(wù)才算結(jié)束,原先的事務(wù)才會(huì)恢復(fù)執(zhí)行 |
MANDATORY | 該屬性指定業(yè)務(wù)方法只能在一個(gè)已經(jīng)存在的事務(wù)中執(zhí)行,業(yè)務(wù)方法不能發(fā)起自己的事務(wù)。如果業(yè)務(wù)方法在沒(méi)有事務(wù)的環(huán)境下調(diào)用,容器就會(huì)拋出異常 |
SUPPORTS | 這一事務(wù)屬性表明,如果業(yè)務(wù)方法在某個(gè)事務(wù)范圍內(nèi)被調(diào)用,則方法成為該事務(wù)的一部分。如果業(yè)務(wù)方法在事務(wù)范圍外被調(diào)用,則方法在沒(méi)有事務(wù)的環(huán)境下執(zhí)行 |
NEVER | 指定業(yè)務(wù)方法絕對(duì)不能在事務(wù)范圍內(nèi)執(zhí)行。如果業(yè)務(wù)方法在某個(gè)事務(wù)中執(zhí)行,容器會(huì)拋出異常,只有業(yè)務(wù)方法沒(méi)有關(guān)聯(lián)到任何事務(wù),才能正常執(zhí)行 |
NESTED | 如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行在一個(gè)嵌套的事務(wù)中. 如果沒(méi)有活動(dòng)事務(wù), 則按REQUIRED屬性執(zhí)行.它使用了一個(gè)單獨(dú)的事務(wù), 這個(gè)事務(wù)擁有多個(gè)可以回滾的保存點(diǎn)。內(nèi)部事務(wù)的回滾不會(huì)對(duì)外部事務(wù)造成影響。它只對(duì)DataSourceTransactionManager事務(wù)管理器起效 |
6.事務(wù)隔離級(jí)別
隔離級(jí)別 | 意義 |
---|---|
DEFAULT | 默認(rèn)的隔離級(jí)別 |
READ_UNCOMMITED | 允許你讀取還未提交的改變了的數(shù)據(jù)??赡軐?dǎo)致臟、幻、不可重復(fù)讀 |
READ_COMMITTED | 允許在并發(fā)事務(wù)已經(jīng)提交后讀取。可防止臟讀,但幻讀和 不可重復(fù)讀仍可發(fā)生 |
REPEATABLE_READ | 對(duì)相同字段的多次讀取是一致的,除非數(shù)據(jù)被事務(wù)本身改變??煞乐古K、不可重復(fù)讀,但幻讀仍可能發(fā)生 |
SERIALIZABLE | 完全服從事務(wù)ACID的隔離級(jí)別,確保不發(fā)生臟、幻、不可重復(fù)讀。這在所有的隔離級(jí)別中是最慢的,它是典型的通過(guò)完全鎖定在事務(wù)中涉及的數(shù)據(jù)表來(lái)完成的 |
不同的隔離級(jí)別采用不同的方式來(lái)實(shí)現(xiàn),在四種隔離級(jí)別中,Serializable的隔離級(jí)別最高,Read Uncommited的隔離級(jí)別最低。
大多數(shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別為Read Commited,如SqlServer,Oracle
當(dāng)然也有少部分?jǐn)?shù)據(jù)庫(kù)默認(rèn)的隔離級(jí)別為Repeatable_Read ,如MySQL,
Oracle數(shù)據(jù)庫(kù)支持READ COMMITTED和SERIALIZABLE兩種事務(wù)隔離性級(jí)別,不支持READ UNCOMMITTED和REPEATABLE READ這兩種隔離性級(jí)別。雖然SQL標(biāo)準(zhǔn)定義的默認(rèn)事務(wù)隔離性級(jí)別是SERIALIZABLE,但是Oracle數(shù)據(jù)庫(kù)默認(rèn)使用的事務(wù)隔離性級(jí)別卻是READ COMMITTED.
以上是“Spring中事務(wù)控制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!