javascript
Spring事务的实现方式和实现原理
Spring事務(wù)的本質(zhì)其實就是數(shù)據(jù)庫對事務(wù)的支持,沒有數(shù)據(jù)庫的事務(wù)支持,spring是無法提供事務(wù)功能的。Spring只提供統(tǒng)一事務(wù)管理接口,具體實現(xiàn)都是由各數(shù)據(jù)庫自己實現(xiàn),數(shù)據(jù)庫事務(wù)的提交和回滾是通過binlog或者undo?log實現(xiàn)的。Spring會在事務(wù)開始時,根據(jù)當(dāng)前環(huán)境中設(shè)置的隔離級別,調(diào)整數(shù)據(jù)庫隔離級別,由此保持一致。
(1)Spring事務(wù)的種類:
spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式:
①編程式事務(wù)管理使用TransactionTemplate。
②聲明式事務(wù)管理建立在AOP之上的。其本質(zhì)是通過AOP功能,對方法前后進(jìn)行攔截,將事務(wù)處理的功能編織到攔截的方法中,也就是在目標(biāo)方法開始之前啟動一個事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。
?
聲明式事務(wù)最大的優(yōu)點就是不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明或通過@Transactional注解的方式,便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中,減少業(yè)務(wù)代碼的污染。唯一不足地方是,最細(xì)粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。?
(2)spring的事務(wù)傳播機制:
spring事務(wù)的傳播機制說的是,當(dāng)多個事務(wù)同時存在的時候,spring如何處理這些事務(wù)的行為。事務(wù)傳播機制實際上是使用簡單的ThreadLocal實現(xiàn)的,所以,如果調(diào)用的方法是在新線程調(diào)用的,事務(wù)傳播實際上是會失效的。
?
① PROPAGATION_REQUIRED:(默認(rèn)傳播行為)如果當(dāng)前沒有事務(wù),就創(chuàng)建一個新事務(wù);如果當(dāng)前存在事務(wù),就加入該事務(wù)。
② PROPAGATION_REQUIRES_NEW:無論當(dāng)前存不存在事務(wù),都創(chuàng)建新事務(wù)進(jìn)行執(zhí)行。
③ PROPAGATION_SUPPORTS:如果當(dāng)前存在事務(wù),就加入該事務(wù);如果當(dāng)前不存在事務(wù),就以非事務(wù)執(zhí)行。‘
④ PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),就把當(dāng)前事務(wù)掛起。
⑤ PROPAGATION_NESTED:如果當(dāng)前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行;如果當(dāng)前沒有事務(wù),則按REQUIRED屬性執(zhí)行。
⑥ PROPAGATION_MANDATORY:如果當(dāng)前存在事務(wù),就加入該事務(wù);如果當(dāng)前不存在事務(wù),就拋出異常。
⑦ PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。?
(3)Spring中的隔離級別:
?
①?ISOLATION_DEFAULT:這是個?PlatfromTransactionManager?默認(rèn)的隔離級別,使用數(shù)據(jù)庫默認(rèn)的事務(wù)隔離級別。
②?ISOLATION_READ_UNCOMMITTED:讀未提交,允許事務(wù)在執(zhí)行過程中,讀取其他事務(wù)未提交的數(shù)據(jù)。
③?ISOLATION_READ_COMMITTED:讀已提交,允許事務(wù)在執(zhí)行過程中,讀取其他事務(wù)已經(jīng)提交的數(shù)據(jù)。
④?ISOLATION_REPEATABLE_READ:可重復(fù)讀,在同一個事務(wù)內(nèi),任意時刻的查詢結(jié)果都是一致的。
⑤?ISOLATION_SERIALIZABLE:所有事務(wù)逐個依次執(zhí)行。??
總結(jié)
以上是生活随笔為你收集整理的Spring事务的实现方式和实现原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring的自动装配
- 下一篇: Spring框架中有哪些不同类型的事件