SpringBoot設定事務隔離等級

2021-10-01 02:05:54 字數 3616 閱讀 8372

spring boot 使用事務非常簡單,首先使用註解 @enabletransactionmanagement 開啟事務支援後,然後在訪問資料庫的service方法上新增註解 @transactional 便可。(在下文中會有圖例)

關於事務管理器,不管是jpa還是jdbc等都實現自介面 platformtransactionmanager 如果你新增的是 spring-boot-starter-jdbc 依賴,框架會預設注入 datasourcetransactionmanager 例項。如果spring容器中存在多個 platformtransactionmanager 例項,並且沒有實現介面 transactionmanagementconfigurer 指定預設值,在我們在方法上使用註解 @transactional 的時候,就必須要用value指定,如果不指定,則會丟擲異常。對於系統需要提供預設事務管理的情況下,實現介面 transactionmanagementconfigurer 指定。對有的系統,為了避免不必要的問題,在業務中必須要明確指定 @transactional 的 value 值的情況下。不建議實現介面 transactionmanagementconfigurer,這樣控制台會明確丟擲異常,開發人員就不會忘記主動指定(這樣也更方便的控制不同業務上使用事務)。

一、配置步驟:

1、在啟動主類新增註解:@enabletransactionmanagement來啟用註解式事務管理,相當於之前在xml中配置的註解驅動。

packagecom.lgy.controller;

import

import

/**

* created by fengch on 2017/12/6.

*/@enabletransactionmanagement

publicclass

publicstaticvoidmain(string args)

}

2、在需要事務的類或者方法(service)上面新增@transactional()註解,裡面可以配置需要的粒度,如開頭說到的,如果沒有設定預設的事務等級,需要在此新增isolation和propagation屬性,還有幾個其他的屬性可以設定,在此只介紹這兩個比較重要的屬性。

@transactional(isolation = isolation.default,propagation = propagation.required)

publicclassdefaultfooserviceimplementsfooservice

//方法上註解屬性會覆蓋類註解上的相同屬性

@transactional(readonly =false, propagation = propagation.requires_new)

publicvoidupdatefoo(foo foo)

}

二、屬性配置:

1、isolation :隔離級別

我們可以看org.springframework.transaction.annotation.isolation列舉類中定義了五個表示隔離級別的值:

public enum isolation
default:這是預設值,表示使用底層資料庫的預設隔離級別。對大部分資料庫而言,通常這值就是:read_committed。 

read_uncommitted:該隔離級別表示乙個事務可以讀取另乙個事務修改但還沒有提交的資料。該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。 

read_committed:該隔離級別表示乙個事務只能讀取另乙個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。 

repeatable_read:該隔離級別表示乙個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止髒讀和不可重複讀。 

serializable:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。 

指定方法:通過使用isolation屬性設定,例如:@transactional(isolation = isolation.default)/

2、propagation:傳播行為

所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。

我們可以看org.springframework.transaction.annotation.propagation列舉類中定義了6個表示傳播行為的列舉值:

public enum propagation
required:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。 

supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。 

mandatory:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。 

requires_new:建立乙個新的事務,如果當前存在事務,則把當前事務掛起。 

not_supported:以非事務方式執行,如果當前存在事務,則把當前事務掛起。 

never:以非事務方式執行,如果當前存在事務,則丟擲異常。 

nested:如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於required。 

指定方法:通過使用propagation屬性設定,例如:@transactional(propagation = propagation.required)

SpringBoot設定事務隔離等級

spring boot 使用事務非常簡單,首先使用註解 enabletransactionmanagement 開啟事務支援後,然後在訪問資料庫的service方法上新增註解 transactional 便可。在下文中會有圖例 關於事務管理器,不管是jpa還是jdbc等都實現自介面 platform...

springboot事務操作

事務 transaction 一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 在計算機術語中,事務通常就是指資料庫事務。並非任意的對資料庫的操作序列都是資料庫事務。事務應該具有4個屬性 原子性 一致性 隔離性 永續性。這四個屬性通常稱為ac...

Mysql 事務隔離級別 InnoDB實現隔離機制

在read uncommitted級別中,事務所做的寫操作,即使沒有提交,對其他事務也是可見的,a事務可以讀取b事務未提交的資料,這就叫做未提交讀 髒讀。這個級別會導致很多問題,但從效能上來說,並不比其他級別好太多。大部分資料庫系統的預設隔離級別就是 read committed,它解決了髒讀的問題...