Spring事務管理的相關介紹(附程式碼)
這篇文章帶給大家的內容是關於Spring事務管理的相關介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
事務
邏輯上的一組操作,組成操作的每個部分要么全部成功,要么全部失敗
事務的特性
一致性: 交易前後資料完整性保持一致
原子性: 交易不能夠分割,要麼全部成功,要麼全部失敗
#隔離性: 交易的執行不受到其他交易的影響,相互之間隔離
#持久性: 交易一旦完成,那麼就會保存到資料庫中,不受系統崩潰的影響
如果不滿足特性引發的問題
隔離性引發的問題:
讀問題
-
#髒讀:交易讀到其他交易還沒有commit的資料
無法重複讀取:一個交易讀取到其他交易提交的更新update數據,導致多次的查詢結果不一致
-
幻讀: 一個事務讀到其他事務插入insert的數據,導致多次查詢結果不一致
寫入問題
丟失操作
#解決讀取問題
設定交易的隔離等級
int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8;
ISOLATION_DEFAULT: 代表spring預設值,表示使用底層資料庫的預設隔離等級。例如mysql 使用ISOLATION_REPEATABLE_READ使用ISOLATION_READ_COMMITTED
ISOLATION_READ_UNCOMMITTED: 未提交讀取,不可以解決讀取問題
ISOLATION_READ_COMMITTED: 已提交讀取,可以解決髒#PATION_READ_COMMITTED: 可以解決讀,不能解決幻讀和不可重複讀
ISOLATION_REPEATABLE_READ: 重複讀取,可以解決髒讀和不可重複讀取
ISOLATION_SERIALIZABLE: 可以解決所有讀取問題,效率不高
Spring中事務管理的api
PlatformTransactionManager:平台事務管理器
PlatformTransactionManager是一個接口,是Spring底層用來管理事務的物件。
public interface PlatformTransactionManager { TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
spring事物官網位址
比較常見的實作類別有:
DataSourceTransactionManager:底層使用JDBC事務管理
HibernateTransactionManager:底層使用Hibernate事務管理
TransactionDefinition:
事務定義:可以定義事務的相關訊息,事務傳播行為,隔離級別,超時信息,是否只讀
package org.springframework.transaction; //可以看到事物的定义也是一个接口 public interface TransactionDefinition { //事物的传播行为,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; //事物的隔离级别五种 int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = 1; int ISOLATION_READ_COMMITTED = 2; int ISOLATION_REPEATABLE_READ = 4; int ISOLATION_SERIALIZABLE = 8; //事物的超时时间,-1代表没有超时时间 int TIMEOUT_DEFAULT = -1; int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); String getName(); }
TransactionStatus: 事務狀態
事務狀態: 記錄管理事務過程中事務狀態的物件
Spring中七種事務的傳播行為
交易的傳播行為是用來解決業務方法之間相互呼叫的問題
官網傳送閘
前置條件:
方法B()中呼叫方法A()
巢狀交易
PROPAGATION_NESTED: A中有事務,A事務正常執行。 A交易執行完成後,設定一個保存點,執行B操作,如果B拋出異常則可回滾到初始位置或回滾到保存點
保證操作在同一個事務裡
PROPAGATION_REQUIRED: 如果B方法呼叫A方法,A方法有事務,B方法就會使用A中的交易。如果A中沒有,B就會建立一個交易
PROPAGATION_SUPPORTS: B呼叫A,A中有事務,使用A中的事務,A中沒有事務則B不使用交易
PROPAGATION_MANDATORY: 如果A用有事務,使用A中的事務,A中沒有事務,拋出異常
保證操作不在同一個事務裡
PROPAGATION_REQUIRES_NEW : A中有事務,把A事務掛起,B開啟事務只包含自身操作。 A中沒有,B建立交易只包含自身操作
PROPAGATION_NOT_SUPPORTED: A中有事務,A掛起,B不使用交易
*PROPAGATION_NEVER: A中有交易B拋出異常
Spring提供了而兩種事務管理方式
#聲明式事務管理: 在Spring設定檔中宣告式的處理事務來取代程式碼式的處理事務(使用的比較多)
程式設計事務管理:程式碼式的處理事務,需要在程式中編寫程式碼
聲明式事務管理
基於xml
<!--配置事务管理器--> <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name="dataSource" ref="dataSource" ></property> </bean> <!--配置事务--> <tx:advice id="myAdvice" transaction-manager="trancationManager"> <tx:attributes> <!--配置事务传播和事务隔离--> <tx:method name="save*" propagation="REQUIRED" isolation="REPEATABLE_READ"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!--事务是利用aop实现的--> <aop:config> <aop:pointcut id="ponitcut" expression="execution(* com.amber.xml.service.AccountServiceImpl.transferMoney(..))"></aop:pointcut> <aop:advisor advice-ref="myAdvice" pointcut-ref="ponitcut" /> </aop:config>
save*表示方法以save開頭的方法,使用PROPATATION_REQUIRED事務傳播,使用REPEATABLE_READ事務隔離
基于注解
<!--配置事务管理器--> <bean id="trancationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name="dataSource" ref="dataSource" ></property> </bean> <!--开启注解事务--> <tx:annotation-driven transaction-manager="trancationManager" />
使用tx:annotation-driven 开启事务的注解后,在使用的时候只需要在类或者方法上加入@Transactional就可以开启注解
基于xml的事务和基于注解的事务对比
文件配置对比
事务基于注解简化了xml中的使用比较
使用注解必须在类或者方法上添加@Trasactional,如果有多个业务类,则需要在每个业务类上添加
使用xml只需要在配置文件中配置包名即可
以上是Spring事務管理的相關介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

2023年,AI技術已成為熱門話題,對各行業產生了巨大影響,程式設計領域尤其如此。人們越來越認識到AI技術的重要性,Spring社群也不例外。隨著GenAI(GeneralArtificialIntelligence)技術的不斷進步,簡化具備AI功能的應用程式的創建變得至關重要和迫切。在這個背景下,"SpringAI"應運而生,旨在簡化開發AI功能應用程式的過程,使其變得簡單直觀,避免不必要的複雜性。透過"SpringAI",開發者可以更輕鬆地建立具備AI功能的應用程序,將其變得更加易於使用和操作

Spring+AI作為行業領導者,透過其強大、靈活的API和先進的功能,為各種行業提供了領先性的解決方案。在本專題中,我們將深入探討Spring+AI在各領域的應用範例,每個案例都將展示Spring+AI如何滿足特定需求,實現目標,並將這些LESSONSLEARNED擴展到更廣泛的應用。希望這個專題能對你有所啟發,更深入地理解和利用Spring+AI的無限可能。 Spring框架在軟體開發領域已經有超過20年的歷史,自SpringBoot1.0版本發布以來已有10年。現在,無人會質疑,Spring

spring編程式事務的實作方式:1、使用TransactionTemplate;2、使用TransactionCallback和TransactionCallbackWithoutResult;3、使用Transactional註解;4、使用TransactionTemplate和@Transactional結合使用;5、自訂事務管理器。

java實作定時任務Jdk自帶的函式庫中,有兩種方式可以實作定時任務,一種是Timer,另一種是ScheduledThreadPoolExecutor。 Timer+TimerTask建立一個Timer就建立了一個線程,可以用來調度TimerTask任務Timer有四個建構方法,可以指定Timer線程的名字以及是否設定為守護線程。預設名字Timer-編號,預設不是守護線程。主要有三種比較重要的方法:cancel():終止任務調度,取消目前調度的所有任務,正在運行的任務不受影響purge():從任務團隊

SpringBoot和SpringCloud都是SpringFramework的擴展,它們可以幫助開發人員更快地建置和部署微服務應用程序,但它們各自有不同的用途和功能。 SpringBoot是一個快速建立Java應用程式的框架,讓開發人員可以更快地建立和部署基於Spring的應用程式。它提供了一個簡單、易於理解的方式來建立獨立的、可執行的Spring應用

Spring設定事務隔離等級的方法:1、使用@Transactional註解;2、在Spring設定檔中設定;3、使用PlatformTransactionManager;4、在Java配置類別中設定。詳細介紹:1、使用@Transactional註解,在需要進行事務管理的類別或方法上加入@Transactional註解,並在屬性中設定隔離等級;2、在Spring設定檔等等。

作為一名Java開發者,學習和使用Spring框架已經是一項必不可少的技能。而隨著雲端運算和微服務的盛行,學習和使用SpringCloud成為了另一個必須掌握的技能。 SpringCloud是一個基於SpringBoot的用於快速建立分散式系統的開發工具集。它為開發者提供了一系列的元件,包括服務註冊與發現、配置中心、負載平衡和斷路器等,使得開發者在建構微

隨著技術的更新迭代,Java5.0開始支援註解。而作為java中的領導框架spring,自從更新了2.5版本之後也開始慢慢捨棄xml配置,更多使用註解來控制spring框架。
