Spring事務管理實現方式(註解,Xml)

2022-07-08 14:24:25 字數 3861 閱讀 6765

isolation :隔離級別

具體的設定方式(註解):例如@transactional(isolation = isolation.default )

隔離級別

含義default

使用資料庫預設的事務隔離級別

read_uncommitted

允許讀取尚未提交的修改,可能導致髒讀、幻讀和不可重複讀

read_committed

允許從已經提交的事務讀取,可防止髒讀、但幻讀,不可重複讀仍然有可能發生

repeatable_read

對相同欄位的多次讀取的結果是一致的,除非資料被當前事務自生修改。可防止髒讀和不可重複讀,但幻讀仍有可能發生

serializable

完全服從acid隔離原則,確保不發生髒讀、不可重複讀、和幻讀,但執行效率最低。

propagation:傳播行為

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

具體的設定方式(註解):@transactional(propagation = propagation.required)

傳播行為

含義required

表示當前方法必須在乙個具有事務的上下文中執行,如有客戶端有事務在進行,那麼被呼叫端將在該事務中執行,否則的話重新開啟乙個事務。(如果被呼叫端發生異常,那麼呼叫端和被呼叫端事務都將回滾)

mandatory

表示當前方法必須在乙個事務中執行,如果沒有事務,將丟擲異常

never

表示當方法務不應該在乙個事務中執行,如果存在乙個事務,則丟擲異常

not_supported

表示該方法不應該在乙個事務中執行。如果有乙個事務正在執行,他將在執行期被掛起,直到這個事務提交或者回滾才恢復執行

supports

表示當前方法不必需要具有乙個事務上下文,但是如果有乙個事務的話,它也可以在這個事務中執行

nested

表示如果當前方法正有乙個事務在執行中,則該方法應該執行在乙個巢狀事務中,被巢狀的事務可以獨立於被封裝的事務中進行提交或者回滾。如果封裝事務存在,並且外層事務丟擲異常回滾,那麼內層事務必須回滾,反之,內層事務並不影響外層事務。如果封裝事務不存在,則同propagation_required的一樣

requires_new

表示當前方法必須執行在它自己的事務中。乙個新的事務將啟動,而且如果有乙個現有的事務在執行的話,則這個方法將在執行期被掛起,直到新的事務提交或者回滾才恢復執行。

幾點說明:

匯入外部資源檔案

註冊元件包掃瞄,把類上標註了@controller @service @repository @component 都會自動加入到spring容器中

配置乙個事物通知,即執行的方法隔離級別和傳播行為, 配置事務通知在類上執行操作(切入點)。

實現步驟:

​ 1、定義資料庫的配置檔案(db.properties),定義業務類userdao,userservice。

​ 2、定義spring的配置檔案(spring-aspect.xml)

​ 匯入通過匯入資料庫配置檔案,然後通過包掃瞄的方式把userdao,userservice註冊到spring的容器當中,配置資料額源,jdbc 的模板,最後事務管理器,配置事務通知,切入點。

配置檔案(db.properties)

db.username=root

db.password=root

db.url=jdbc:mysql:

db.driverclass=com.mysql.jdbc.driver

業務類(userdao,userservice)

@repository

public class userdao

}@service

public class userservice

}

spring配置檔案(spring-aspect.xml)

<?xml version="1.0" encoding="utf-8"?>

測試方法

public class aspecttest 

}

基於註解實現

第一步是在需要事務的類或者方法上面新增@transactional()註解,裡面可以通過propagation和isolation指定事務的隔離級別和傳播行為。

@service

public class userservice

}

@enabletransactionmanagement來啟用註解式事務管理,相當於之前在xml中配置的註解驅動。

通過包掃瞄@componentscan相當於 實現業務類註冊到spring容器當中。

通過@propertysource和 @value實現讀取配置檔案,並且把之賦值到對應的屬性當中。

@configuration 說明該類是乙個配置類相當於(),@bean 相當於(),註冊資料來源,jdbc模板,事務管理器。

@enabletransactionmanagement

@componentscan(basepackages = "zfcoding.tx")

@propertysource("classpath:db.properties")

@configuration

public class mydatasourceconfig ")

private string username;

@value("$")

private string password;

@value("$")

private string url;

@value("$")

private string driveclass;

@bean

public datasource datasource() throws propertyvetoexception

@bean

public jdbctemplate jdbctemplate() throws propertyvetoexception

//註冊事務管理器在容器中

@bean

public platformtransactionmanager transactionmanager() throws propertyvetoexception

}

測試類

public class txtest 

}

基於xml實現

配置檔案

<?xml version="1.0" encoding="utf-8"?>

測試類

public class xmltxtest 

}

以上就是spring 事務配置的全過程,完事。

往期內容

spring ioc 知識點彙總

spring aop 的實現方式(xml, 註解)

深入理解spring中bean的生命週期

spring事務管理方式

spring配置檔案中關於事務配置總是由三個組成部分,分別是datasource transactionmanager和 機制這三部分,無論哪種配置方式,一般變化的只是 機制這部分。datasource transactionmanager這兩部分只是會根據資料訪問方式有所變化,比如使用hibern...

Spring事務管理

spring是ssh中的管理員,負責管理其它框架,協調各個部分的工作。今天一起學習一下spring的事務管理。spring的事務管理分為宣告式跟程式設計式。宣告式就是在spring的配置檔案中進行相關配置 程式設計式就是用註解的方式寫到 裡。下面先說宣告式 spring配置檔案中關於事務配置總是由三...

spring事務管理

一 xml配置事務 二 註解的方式配置事務 bean id txmanaager class org.springframework.orm.hibernate3.hibernatetransactionmanager property name sessionfactory ref session...