天天看點

第十一篇:spring管理

1:Spring事務概述

事務是一個不可分割的邏輯工作單元,具備ACID特性,實際工作中可借助Spring進行事務管理

事務四大特性:ACID

1)原子性(一個事務中的多個操作要麼都成功,要麼都失敗)

2)一緻性(例如存錢操作,存之前和存之後的錢數應該是一緻的)

3)隔離性(事務與事務應該是互相隔離的)

4)持久性(事務一旦送出,資料要持久儲存)

Spring提供了兩種事務管理方式,程式設計式事務和聲明式事務,程式設計式事務指的是通過編碼方式實作事務:聲明式事務基于AOP,将具體業務邏輯與事務處了解耦,聲明式事務管理使業務代碼邏輯不受污染,是以在實際使用中聲明式事務用的比較多

Spring中聲明式事務處理有兩種方式,一種是在配置檔案(xml)中做相關的事務規則聲明,另一種是基于@Transactional注解的方式

在類或方法中使用@Transaction注解應用事務

value當在配置檔案中有多個TransactionManager,可以用該屬性指定選中哪個事務管理器

propagation事務的傳播行為,預設值為REQUIRED

isolation事務的隔離度,預設值采用DEFAULT

timeout事務的逾時時間,預設值為-1.如果超過該時間限制但事務還沒有完成,則自動復原事務

read-only 指定事務是否為隻讀事務,預設值為false,為了忽略那些不需要事務的方法,比如讀取資料,可以設定read-only為true

rollback-for用于指定能夠觸發事務復原的異常類型,如果有多個異常類型需要指定,各類型之間可以通過逗号分隔

no-rollback-for 抛出no-rollback-for指定的異常類型,不復原事務

說明:@Transactional注解可以用在方法上也可以添加到類級别上,當把@Transactional注解放在類級别時,表示所有該類的公共方法都配置相同的事務屬性資訊,EmployeeService的所有方法都支援事務并且是隻讀.當類級别配置了@Transactional,方法級别也配置了@Transactional,應用程式會以方法級别的事務屬性資訊來管理事務,換言之,方法級别的事務屬性資訊會覆寫類級别的相關配置資訊

Spring事務的傳播特性

事務的傳播特性:事務方法之間互相調用時,事務的傳播方式

@Transactional(propagation=Propagation.REQUIRED)如果沒有事務建立新事物,如果目前有事務參與目前事務

@Transactional(propagation=Propagation.REQUIRES_NEW)必須是新事務,如果有目前事務,挂起目前事務并且開啟新事務

@Transactional(propagation=Propagation.MANDATORY)必須有事務,如果目前沒有事務就抛異常

@Transactional(propagation=Propagation.NEVER)絕對不能有事務,如果在事務中調用則抛出異常

@Transactional(propagation=Propagation.NESTED)必須被嵌套到其他事務中

@Transactional(propagation=Propagation.NOT_SUPPORTED)不支援事務

@Transactional(propagation=Propagation.SUPPORTS)支援事務,如果沒有事務也不會建立新事務

Spring事務的隔離級别?

多個事務并發執行時可能會導緻什麼問題?(髒讀,不可重複讀,幻讀)

當多個事務并發執行時,可通過設定事務的隔離級别保證事務的完整性,一緻性.事務的隔離級别從低到高有如下幾種方式:

1)READ_UNCOMMITTED(此級别可能會出現髒讀)

2)READ_COMMITTED(此級别可能會出現不可重複讀)

3)REPEATABLE_READ(此級别可能會出現幻讀)

4)SERIALIZABLE(多事務串行執行)

Mysql中如何檢視目前系統預設隔離級别?

  show variables like ‘%storage_engine%’

Mysql中如何設定事務隔離級别?

 set session transaction isolation level ‘reapable read’

繼續閱讀