spring 支援的事務策略,包括兩種
spring boot 的事務原理
兩種事務管理方式: 全面分析spring的程式設計式事務和宣告式事務
>
......
"bankservicetarget"
class
="footmark.spring.core.tx.declare.classic.bankserviceimpl"
>
name
="bankdao"
ref="bankdao"
/>
bean
>
"bankservice"
class
="org.springframework.transaction.interceptor.transactionproxyfactorybean"
>
name
="target"
ref="bankservicetarget"
/>
name
="transactionmanager"
ref="transactionmanager"
/>
name
="transactionattributes"
>
>
key=
"transfer"
>
propagation_requiredprop
>
props
>
property
>
bean
>
......
beans
>
基於 和 命名空間的宣告式事務管理是目前推薦的方式,其最大特點是與 spring aop 結合緊密,可以充分利用切點表示式的強大支援,使得管理事務更加靈活。
>
......
"bankservice"
class
="footmark.spring.core.tx.declare.namespace.bankserviceimpl"
>
name
="bankdao"
ref="bankdao"
/>
bean
>
<
tx:adviceid=
"bankadvice"
transaction-manager
="transactionmanager"
>
<
tx:attributes
>
<
tx:method
name
="transfer"
propagation
="required"
/>
tx:attributes
>
tx:advice
>
<
aop:config
>
<
aop:pointcutid=
"bankpointcut"
expression
="execution(* *.transfer(..))"
/>
<
aop:advisor
advice-ref
="bankadvice"
pointcut-ref
="bankpointcut"
/>
aop:config
>
......
beans
>
基於 @transactional 的方式將宣告式事務管理簡化到了極致。透徹的掌握 spring 中的 @transactional ; @enabletransactionmanagement 的使用。spring boot 使用事務非常簡單,首先使用註解 @enabletransactionmanagement 開啟事務支援後,然後在訪問資料庫的service方法上新增註解 @transactional 便可。
//啟註解事務管理,等同於xml配置方式的
@enabletransactionmanagement
public
class
public
static
void
main
(string[
] args)
}
// service層
@transactional
(propagation = propagation.required,readonly=
true
)public
boolean
transfer
(long fromid, long toid, double amount)
@transactional 註解的屬性說明
屬性名說明
name
當在配置檔案中有多個 transactionmanager , 可以用該屬性指定選擇哪個事務管理器。
propagation
事務的傳播行為,預設值為 required:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立新的事務執行。propagation_supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。propagation_not_supported:以非事務方式執行,如果當前存在事務,則把當前事務掛起。propagation_never:以非事務方式執行,如果當前存在事務,則丟擲異常。
isolation
事務的隔離度,預設值採用 default。
timeout
事務的超時時間,預設值為-1。如果超過該時間限制但事務還沒有完成,則自動回滾事務。
read-only
指定事務是否為唯讀事務,預設值為 false;為了忽略那些不需要事務的方法,比如讀取資料,可以設定 read-only 為 true。
rollback-for
用於指定能夠觸發事務回滾的異常型別,如果有多個異常型別需要指定,各型別之間可以通過逗號分隔。預設情況下,如果在事務中丟擲了未檢查異常(繼承自 runtimeexception 的異常)或者 error,則 spring 將回滾事務;除此之外,spring 不會回滾事務。如果在事務中丟擲其他型別的異常,並期望 spring 能夠回滾事務,可以指定 rollbackfor
no-rollback- for
丟擲 no-rollback-for 指定的異常型別,不回滾事務。
常見問題
jpa 丟擲異常: transaction rolled back because it has been marked as rollback-only"
同一類中的方法自呼叫問題
在spring的文件中說道,spring宣告式事務管理預設對非檢查型異常和執行時異常進行事務回滾,而對檢查型異常則不進行回滾操作
spring 事務的總結
1.初識事務 事務就是對資料資源進行可控的一組訪問操作。為保證事務執行前後,資料資源所承載的系統狀態所處於正確的狀態,事務本身有四個屬性 原子 性,一致性,隔離性和永續性。原子性 原子性要求所有操作是乙個整體,要麼全部提交,要麼全部失敗。一致性 要求事務對資料資源執行一致性檢查,事務提交之前是處於某...
spring事務總結
1.spring中被標有 transactional註解 也就是事務 的方法不能夠自己呼叫自己。2.在同乙個service實現類中,不同的方法之間可以相互呼叫。3.spring框架的事務基礎架構 將預設地只在丟擲執行時和unchecked exceptions時才標識事務回滾。也就是說,當丟擲乙個 ...
spring 事務總結
tx是由aop實現的 aop的實現方式 1 方式 spring aop 1.jdk的基於介面方式 2.cglib的基於類的方式 修改位元組碼,加入extend 類?這兩種 方式 都存在父子關係,也跟日常生活中的 一樣。具體可以參考動態 模式 2 非 aspectj?這貨沒用 實現?有空看看cglib...