天天看點

淺談spring事務管理的2種方式:程式設計式事務管理和聲明式事務管理;以及@Transactional(rollbackFor=Exception.class)注解用法

事務的概念,以及特性:

百度百科介紹:

->資料庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確定除非事務性單元内的所有操作都成功完成,否則不會永久更新面向資料的資源。通過将一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢複并使應用程式更加可靠。一個邏輯工作單元要成為事務,必須滿足所謂的 ACID(原子性、一緻性、隔離性和持久性)屬性。 事務是資料庫運作中的邏輯工作機關,由DBMS中的事務管理子系統負責事務的處理。

spring 支援程式設計式事務管理以及聲明式事務管理這兩種方式;

1、程式設計式事務:

一種是spring官方推薦使用 TransactionTemplate ,另一種方式就是在PlatformTransactionManager上進行操作;

Spring架構進行事務的管理,首先使用TransactionDefinition對事務進行定義。通過PlatformTransactionManager 根據 TransactionDefinition的定義資訊進行事務的管理。在事務管理過程中産生一系列的狀态:儲存到TransactionStatus中

2、聲明式事務:

聲明式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目标方法開始之前建立或者加入一個事務,在執行完目标方法之後根據執行情況送出或者復原事務。

一種是基于tx 和 aop名字空間的xml配置檔案,另一種就是基于@Transactional注解;

xml配置可參考https://blog.csdn.net/weixin_42323802/article/details/83870719

@Transactional(rollbackFor=Exception.class)注解用法:

在聲明式注解開發中,@Transactional(rollbackFor=Exception.class)注解作用為,如果類加了這個注解,那麼這個類裡面的方法隻要抛出異常,就會復原,資料庫裡面的資料也會復原。
在@Transactional注解中如果不配置rollbackFor屬性,那麼事務隻會在RuntimeException的時候才會復原;

2018.11.14

spring的事務管理器接口 :PlatformTransactionManager

實作類有:

DataSourceTransactionManager SpringJdbc 或者iBatis持久化 使用

HibernateTransactionManager

JpaTransactionManager

JdoTransactionManager

JtaTransactionManager 一個事務跨越多個資源時候必須使用;

事務隔離級别5個:

int ISOLATION_DEFAULT = -1; // 預設級别

int ISOLATION_READ_UNCOMMITTED = 1; // 可以讀未送出

int ISOLATION_READ_COMMITTED = 2; // 可以讀已送出 oracle預設級别

int ISOLATION_REPEATABLE_READ = 4; //是否讀取 其他事務送出修改後的 mysql預設級别

int ISOLATION_SERIALIZABLE = 8; // 是否讀取 其他事務送出添加後的

int TIMEOUT_DEFAULT = -1; 無逾時限制

spring事務的傳播行為7個:

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;// 若目前存在事務,嵌套事務執行;由使用者決定,送出還是復原

資料庫并發引起的一系列讀的問題:

1、髒讀 :read uncommitted

2、不可重複讀:read committed

3、幻讀 :repeatable read

髒讀,事務A讀取事務B未送出的資料,若B復原,事務A讀取到的資料是無意義的,稱之為髒讀,該問題極為嚴重;

->不可重複讀,事務A執行事務過程中,讀取事務B資料2次,若事務B對資料進行了更新,導緻A讀取的結果和第一次不一緻;該問題稱之為不可重複讀;

->幻讀,事務A執行過程中,事務B進行了一個更新操作,并送出資料,導緻事務A在2次讀取資料結果不一緻;

不可重複讀和幻讀的差別:

前者側重于 修改删除資料,後者側重于資料的新增;

->解決該問題,資料庫添加表級鎖,在事務執行時候,鎖定表;根據鎖定對象不同:分為行級鎖和表級鎖;根據并發事務鎖定的關系上看:分為共享鎖定和獨占鎖定,共享鎖定會防止獨占鎖定但允許其他的共享鎖定。而獨占鎖定既防止共享鎖定也防止其他獨占鎖定。

由于鎖機制複雜程度較高,是以設定資料庫的隔離級别,資料庫就會自動分析sql語句然後自動選擇合适的鎖;

但是,資料庫隔離級别越高,并發性就越低,一般選擇資料庫預設的即可;

隔離級别 髒讀 不可重複讀 幻讀 資料庫預設
DEFAULT = -1
READ_UNCOMMITTED=1
READ_COMMITTED=2 x oracle預設的
REPEATABLE_READ=4 x x mysql預設的
SERIALIZABLE=8 x x x

參考自 http://www.cnblogs.com/clwydjgs/p/9317849.html

https://blog.csdn.net/starlh35/article/details/76445267

繼續閱讀