Spring 的事務(wù)管理

Spring 事務(wù)的隔離級別和傳播行為

try catch 對 Spring 事務(wù)的影響

一、Spring 事務(wù)管理的兩種方式

1??編程式事務(wù)侵入到了業(yè)務(wù)代碼里面,但是提供了更加詳細的事務(wù)管理。編程式事務(wù)使用 TransactionTemplate 或者直接使用底層的 PlatformTransactionManager。對于編程式事務(wù)管理,Spring 推薦使用 TransactionTemplate。
2??聲明式事務(wù)基于 AOP,既能管理事務(wù),又不影響業(yè)務(wù)代碼。本質(zhì)是對方法前后進行攔截,然后在目標方法開始之前創(chuàng)建或者加入一個事務(wù),在目標方法執(zhí)行完后根據(jù)執(zhí)行情況提交或者回滾事務(wù)。最大的優(yōu)點就是不需要通過編程的方式管理事務(wù),這樣就不需要在業(yè)務(wù)邏輯代碼中摻雜事務(wù)管理的代碼,只需在配置文件中做相關(guān)的事務(wù)規(guī)則聲明(或基于 @Transactional 的方式),便可以將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。

二、對比說明

顯然聲明式事務(wù)管理要優(yōu)于編程式事務(wù)管理,這正是 Spring 倡導的非侵入式的開發(fā)方式。聲明式事務(wù)管理使業(yè)務(wù)代碼不受污染,一個 POJO,只要加上注解就可以獲得完全的事務(wù)支持。和編程式事務(wù)相比,聲明式事務(wù)唯一不足的地方,它的最細粒度只能作用到方法級別,無法做到像編程式事務(wù)那樣可以作用到代碼塊級別。但是即便有這樣的需求,也存在很多變通的方法,比如,可以將需要進行事務(wù)管理的代碼塊獨立為方法等等。

三、聲明式事務(wù)管理的兩種實現(xiàn)

聲明式事務(wù)管理有兩種常用的方式,一種是基于 tx 和 aop 名字空間的 xml 配置文件,另一種就是基于 @Transactional。顯然基于注解的方式更簡單易用,更清爽。

四、@Transactional 一般可以作用在類或者方法上

1??作用于類:當把 @Transactional 放在類上時,表示該類所有的 public 方法都配置相同的事務(wù)屬性信息。
2??作用于方法:當類配置了@Transactional,方法也配置了 @Transactional,方法的事務(wù)會覆蓋類的事務(wù)配置信息。

五、Spring 事務(wù)的基本原理

Spring 事務(wù)的本質(zhì)其實就是數(shù)據(jù)庫對事務(wù)的支持,沒有數(shù)據(jù)庫的事務(wù)支持,Spring 是無法提供事務(wù)功能的。對于純 JDBC 操作數(shù)據(jù)庫,想要用到事務(wù),可以按照以下步驟進行:

  1. 獲取連接 Connection con = DriverManager.getConnection();
  2. 開啟事務(wù) con.setAutoCommit(true/false);
  3. 執(zhí)行 CRUD;
  4. 提交事務(wù)/回滾事務(wù) con.commit()/con.rollback();
  5. 關(guān)閉連接 con.close()。

使用 Spring 的事務(wù)管理功能后,開發(fā)者可以不再寫步驟 2 和 4 的代碼,而是由 Spirng 自動完成。Spring 是如何在 CRUD 前后開啟/關(guān)閉事務(wù)的?解決這個問題,也就可以從整體上理解 Spring 的事務(wù)管理實現(xiàn)原理了。下面簡單地介紹下,注解方式為例子:

  1. 配置文件開啟注解驅(qū)動,在相關(guān)的類和方法上通過 @Transactional 標識。
  2. Spring 在啟動的時候會去解析生成相關(guān)的 bean,這時候會查看擁有相關(guān)注解的類和方法,并且為這些類和方法生成代理,并根據(jù) @Transactional 的相關(guān)參數(shù)進行相關(guān)配置注入,這樣就在代理中把相關(guān)的事務(wù)實現(xiàn)了(開啟正常提交事務(wù),異?;貪L事務(wù))。
  3. 真正的數(shù)據(jù)庫層的事務(wù)提交和回滾是通過 redo log/binlog 實現(xiàn)的。

六、原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)

事務(wù)最經(jīng)典的例子就是轉(zhuǎn)賬了。假如小黑要給小白轉(zhuǎn)賬 100 元,這個轉(zhuǎn)賬會涉及到兩個關(guān)鍵操作就是:將小黑的余額減少 100 元,將小白的余額增加 100 元。萬一在這兩個操作之間突然出現(xiàn)錯誤(如銀行系統(tǒng)崩潰等),導致小黑余額減少而小白的余額沒有增加,這樣就不對了。事務(wù)就是保證這兩個關(guān)鍵操作要么都成功,要么都要失敗。

1??原子性。一個事務(wù)是一個不可分割的工作單位,事務(wù)中包括的操作要么都做,要么都不做。
2??一致性。事務(wù)必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。一致性與原子性是密切相關(guān)的。
3??隔離性。一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對并發(fā)的其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個事務(wù)之間不能互相干擾。
4??持久性。持久性也稱永久性(permanence),指一個事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其有任何影響。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、事務(wù) 1、事務(wù)四要素:ACID 對于事務(wù),我之前的理解是很粗糙的,不就是為了保證操作的原子性么?一般訂單系統(tǒng)或...
    張偉科閱讀 1,497評論 0 5
  • 在JDK源代碼java.sql.Connection類中,明確定義了JDBC支持的4個類型的事務(wù)隔離級別,在Con...
    CloudHuang閱讀 1,433評論 0 1
  • 事務(wù),是為了保障邏輯處理的原子性、一致性、隔離性、永久性。 通過事務(wù)控制,可以避免因為邏輯處理失敗而導致產(chǎn)生臟數(shù)據(jù)...
    uzip柚子皮閱讀 4,808評論 3 16
  • 中國當代文學大師、畫家木心說: “中國神話,好有好報,惡有惡報,太現(xiàn)實,神權(quán)、夫權(quán),誰管誰,滲透神話,令人懼怕?!?..
    楊博寧閱讀 890評論 0 2
  • SnowflakeIdWorker c++11 Twitter Snowflake c++11實現(xiàn)版本 代碼位置 ...
    Jiawa閱讀 1,148評論 0 1

友情鏈接更多精彩內(nèi)容