最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
小牛帶你走進(jìn)Spring的事務(wù)

摘要
本文摘抄了Spring事務(wù)相關(guān)的一些理論,主要講述事務(wù)的特性、事務(wù)的傳播行為、事務(wù)的隔離規(guī)則。

從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。創(chuàng)新互聯(lián)建站將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。

關(guān)鍵詞:事務(wù)特性,事務(wù)傳播,事務(wù)隔離

一、什么是事務(wù)
事務(wù)是用來保證數(shù)據(jù)的完整性和一致性,正如金錢轉(zhuǎn)賬,金錢總數(shù)不會(huì)增加也不會(huì)減少。

數(shù)據(jù)庫 事務(wù)管理有四個(gè)特性(ACID):

特性描述原子性(Atomicity)事務(wù)作為一個(gè)整體被執(zhí)行,要么全部被執(zhí)行,要么都不執(zhí)行。一致性(Consistency)事務(wù)應(yīng)確保數(shù)據(jù)的狀態(tài)從一個(gè)一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致狀態(tài),數(shù)據(jù)不應(yīng)該被破壞。隔離性(Isolation)多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),一個(gè)事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行。持久性(Durability)已被提交的事務(wù)對(duì)數(shù)據(jù)的修改應(yīng)該永久性的。

二、Spring事務(wù)管理器

  1. 事務(wù)管理接口

Spring中定義了事務(wù)管理的總接口PlatformTransactionManager,該接口定義了以下幾個(gè)接口來管理事務(wù):

getTransaction() - 獲取事務(wù)狀態(tài)(TransactionStatus),該事務(wù)由(TransactionDefinition定義)
commit() - 提交事務(wù)
rollback() - 回滾事務(wù)
Spring不直接管理事務(wù),而是提供一個(gè)事務(wù)管理接口,由其他平臺(tái)(如JDBC、Hibernate)自己實(shí)現(xiàn)事務(wù)管理。

幾個(gè)具體的事務(wù):

事務(wù)名稱管理器類說明JDBC事務(wù)org.springframework.jdbc.datasource.DataSourceTransactionManager通過調(diào)用java.sql.Connection來管理事務(wù)Hibernateorg.springframework.orm.hibernate3.HibernateTransactionManager事務(wù)管理由org.hibernate.Transaction對(duì)象負(fù)責(zé)Java持久化API事務(wù)(JPA)org.springframework.orm.jpa.JpaTransactionManagerJpaTransactionManager與由工廠(javax.persistence.EntityManagerFactory)所產(chǎn)生的JPA EntityManager合作來構(gòu)建事務(wù)Java原生API事務(wù)org.springframework.transaction.jta.JtaTransactionManagerJtaTransactionManager將事務(wù)管理的責(zé)任委托給javax.transaction.UserTransaction和javax.transaction.TransactionManager對(duì)象(允許在多個(gè)數(shù)據(jù)庫之間管理多個(gè)事務(wù))

關(guān)于JTA,參考Java中的事務(wù)——JDBC事務(wù)和JTA事務(wù)

小牛帶你走進(jìn)Spring的事務(wù)
(Spring事務(wù)管理器)

  1. 事務(wù)管理與AOP

Spring通過AOP攔截所有需要事務(wù)管理的業(yè)務(wù)處理方法。

三、Spring事務(wù)屬性
Spring事務(wù)有幾個(gè)屬性,TransactionDefinition接口可以體現(xiàn)出來:

public interface TransactionDefinition {

// 事務(wù)傳播行為定義

int PROPAGATION_REQUIRED = 0;

int PROPAGATION_SUPPORTS = 1;

int PROPAGATION_MANDATORY = 2;

int PROPAGATION_REQUIRES_NEW = 3;

int PROPAGATION_NOT_SUPPORTED = 4;

int PROPAGATION_NEVER = 5;

int PROPAGATION_NESTED = 6;

// 事務(wù)隔離級(jí)別定義

int ISOLATION_DEFAULT = -1;

int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;

int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;

int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;

int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

// 默認(rèn)超時(shí)時(shí)間

int TIMEOUT_DEFAULT = -1;

// 獲取事務(wù)傳播行為

int getPropagationBehavior();

// 獲取事務(wù)隔離級(jí)別

int getIsolationLevel();

// 獲取事務(wù)超時(shí)時(shí)間

int getTimeout();

// 獲取事務(wù)是否只讀

boolean isReadOnly();

// 獲取事務(wù)名字

String getName();

}

接口的定義加上回滾規(guī)則,事務(wù)可以有以下五個(gè)基本配置:事務(wù)傳播行為、事務(wù)隔離級(jí)別、事務(wù)超時(shí)、事務(wù)只讀、回滾規(guī)則

  1. 傳播行為

所謂傳播行為(propagation behavior)指一個(gè)事務(wù)方法被另一個(gè)事務(wù)方法調(diào)用時(shí),事務(wù)應(yīng)該如何處理。被調(diào)用的方法可能在現(xiàn)有事務(wù)中運(yùn)行,或者啟動(dòng)一個(gè)新的事務(wù),在自己事務(wù)內(nèi)運(yùn)行。

傳播行為含義解釋PROPAGATION_REQUIRED表示當(dāng)前方法必須運(yùn)行在事務(wù)中。如果當(dāng)前事務(wù)存在,方法將會(huì)在該事務(wù)中運(yùn)行。否則,會(huì)啟動(dòng)一個(gè)新的事務(wù)有且只有一個(gè)事務(wù)PROPAGATION_SUPPORTS表示當(dāng)前方法不需要事務(wù)上下文,但是如果存在當(dāng)前事務(wù)的話,那么該方法會(huì)在這個(gè)事務(wù)中運(yùn)行如果方法單獨(dú)調(diào)用則是非事務(wù)執(zhí)行,如果方法被另一個(gè)有事務(wù)的方法調(diào)用,被調(diào)用方法則加入事務(wù)PROPAGATION_MANDATORY表示該方法必須在事務(wù)中運(yùn)行,如果當(dāng)前事務(wù)不存在,則會(huì)拋出一個(gè)異常如果單獨(dú)非事務(wù)調(diào)用會(huì)拋異常,必須被其它事務(wù)方法調(diào)用,加入到事務(wù)中。PROPAGATION_REQUIRED_NEW表示當(dāng)前方法必須運(yùn)行在它自己的事務(wù)中。一個(gè)新的事務(wù)將被啟動(dòng)。如果存在當(dāng)前事務(wù),在該方法執(zhí)行期間,當(dāng)前事務(wù)會(huì)被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager總是開啟一個(gè)新的事務(wù),原調(diào)用事務(wù)存在的話會(huì)被掛起,直至事務(wù)完成。PROPAGATION_NOT_SUPPORTED表示該方法不應(yīng)該運(yùn)行在事務(wù)中。如果存在當(dāng)前事務(wù),在該方法運(yùn)行期間,當(dāng)前事務(wù)將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager總是非事務(wù)地執(zhí)行該方法,如果調(diào)用事務(wù)存在的話會(huì)被掛起,直至方法執(zhí)行完成PROPAGATION_NEVER表示當(dāng)前方法不應(yīng)該運(yùn)行在事務(wù)上下文中。如果當(dāng)前正有一個(gè)事務(wù)在運(yùn)行,則會(huì)拋出異??偸欠鞘聞?wù)性執(zhí)行方法,否則拋出異常PROPAGATION_NESTED表示如果當(dāng)前已經(jīng)存在一個(gè)事務(wù),那么該方法將會(huì)在嵌套事務(wù)中運(yùn)行。嵌套的事務(wù)可以獨(dú)立于當(dāng)前事務(wù)進(jìn)行單獨(dú)地提交或回滾。如果當(dāng)前事務(wù)不存在,那么其行為與PROPAGATION_REQUIRED一樣。注意各廠商對(duì)這種傳播行為的支持是有所差異的??梢詤⒖假Y源管理器的文檔來確認(rèn)它們是否支持嵌套事務(wù)嵌套事務(wù)一個(gè)非常重要的概念就是內(nèi)層事務(wù)依賴于外層事務(wù)。外層事務(wù)失敗時(shí),會(huì)回滾內(nèi)層事務(wù)所做的動(dòng)作。而內(nèi)層事務(wù)操作失敗并不會(huì)引起外層事務(wù)的回滾。

  1. 隔離規(guī)則

事務(wù)的執(zhí)行會(huì)存在并發(fā)的,隔離級(jí)別定義了一個(gè)事務(wù)受其它并發(fā)事務(wù)影響的程度。

有兩個(gè)表格:

并發(fā)事務(wù)引起的問題

問題定義出現(xiàn)原因臟讀讀到無效的數(shù)據(jù)當(dāng)一個(gè)事務(wù)讀取了另一個(gè)事務(wù)修改但未提交的數(shù)據(jù),如果修改回滾,則事務(wù)讀取了無效的數(shù)據(jù)。不可重復(fù)讀同一個(gè)事務(wù)中兩次相同查詢中,讀取到不同的數(shù)據(jù)一個(gè)事務(wù)兩次查詢期間,另一個(gè)并發(fā)事務(wù)對(duì)數(shù)據(jù)進(jìn)行了更新?;米x同一個(gè)事務(wù)在兩次相同的查詢中,讀取到不同記錄數(shù)的數(shù)據(jù)一個(gè)事務(wù)兩次查詢期間,另一個(gè)并發(fā)事務(wù)進(jìn)行了數(shù)據(jù)新增或刪除。

隔離級(jí)別

隔離級(jí)別說明并發(fā)事務(wù)可能引起的問題ISOLATION_DEFAULT使用后端數(shù)據(jù)庫默認(rèn)的隔離級(jí)別具體情況具體分析ISOLATION_READ_UNCOMMITTED最低的隔離級(jí)別,允許讀取尚未提交的數(shù)據(jù)變更臟讀、不可重復(fù)讀、幻讀ISOLATION_READ_COMMITTED允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù)不可重復(fù)讀、幻讀ISOLATION_REPEATABLE_READ對(duì)同一字段的多次讀取結(jié)果一致,除非字段被本事務(wù)修改幻讀ISOLATION_SERIALIZABLE最高的隔離級(jí)別,完全服從ACID原則,通常通過鎖表實(shí)現(xiàn)(最慢)無

  1. 事務(wù)超時(shí)

給定事務(wù)一個(gè)超時(shí)時(shí)間,如果特定時(shí)間事務(wù)沒有執(zhí)行完畢,事務(wù)會(huì)自動(dòng)回滾。

  1. 是否只讀?

設(shè)置了只讀事務(wù),那么在此事務(wù)執(zhí)行過程中,其它事務(wù)對(duì)數(shù)據(jù)庫的修改對(duì)于該事務(wù)來說是透明的,即看不到其它事務(wù)修改后的數(shù)據(jù)。這通常用于執(zhí)行多次查詢來統(tǒng)計(jì)信息時(shí),能夠保證數(shù)據(jù)的整體一致性。

  1. 回滾規(guī)則

回滾規(guī)則定義了哪些異常,事務(wù)會(huì)進(jìn)行回滾。默認(rèn)情況下,事務(wù)只有遇到運(yùn)行時(shí)異常才會(huì)回滾,而在遇到檢查型異常時(shí)不會(huì)回滾。

四、Spring事務(wù)管理形式

  1. 編程式事務(wù)

使用TransactionTemplate或PlatformTransactionManager

TransactionTemplate tt = new TransactionTemplate();

tt.execute(status -> {

// 執(zhí)行操作

doSth();

// 返回操作結(jié)果

return obj;

});

  1. 聲明式事務(wù)

參考:Spring事務(wù)配置的五種方式

六、總結(jié)
Spring定義了事務(wù)管理器的接口,具體實(shí)現(xiàn)由特定平臺(tái)來實(shí)現(xiàn);
Spring事務(wù)有五個(gè)屬性:事務(wù)傳播行為、事務(wù)隔離級(jí)別、事務(wù)超時(shí)、事務(wù)只讀、回滾規(guī)則;
傳播行為:required、supports、mandatory、required_new、not_support、never、nested;
隔離級(jí)別:default、read_uncommited、read_committed、repeatable_read、serializable;


文章標(biāo)題:小牛帶你走進(jìn)Spring的事務(wù)
當(dāng)前鏈接:http://fisionsoft.com.cn/article/ijshop.html