spring--聲明式事務

聲明式事務

1、回顧事務

  • 要么都成功,要么都失敗!

  • 事務在項目開發中,十分重要,涉及數據的一致性問題

  • 確保完整性和一致性

事務ACID:

  • 原子性:事務是原子性操作,由一系列動作組成,事務的原子性確保動作要么全部完成,要么完全不起作用

  • 一致性:

    • 一旦所有事務動作完成,事務就要被提交。數據和資源處于一種滿足業務規則的一致性狀態中

  • 隔離性

    • 多個業務可能操作同一個資源,防止數據損壞

  • 持久性

    • 事務一旦提交,無論系統發生什么問題,結果都不會被影響,被持久性地寫進存儲器中

    測試

    將上面的代碼拷貝到一個新項目中

    在之前的案例中,我們給userDao接口新增兩個方法,刪除和增加用戶;

    ?//添加一個用戶int addUser(User user);?//根據id刪除用戶int deleteUser(int id);

    mapper文件,我們故意把 deletes 寫錯,測試!

    ?<insert id="addUser" parameterType="com.kuang.pojo.User">insert into user (id,name,pwd) values (#{id},#{name},#{pwd})</insert>?<delete id="deleteUser" parameterType="int">deletes from user where id = #{id}</delete>

    編寫接口的實現類,在實現類中,我們去操作一波

    ?public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {?//增加一些操作public List<User> selectUser() {User user = new User(4,"小明","123456");UserMapper mapper = getSqlSession().getMapper(UserMapper.class);mapper.addUser(user);mapper.deleteUser(4);return mapper.selectUser();}?//新增public int addUser(User user) {UserMapper mapper = getSqlSession().getMapper(UserMapper.class);return mapper.addUser(user);}//刪除public int deleteUser(int id) {UserMapper mapper = getSqlSession().getMapper(UserMapper.class);return mapper.deleteUser(id);}?}

    測試

    ?@Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");UserMapper mapper = (UserMapper) context.getBean("userDao");List<User> user = mapper.selectUser();System.out.println(user);}

    報錯:sql異常,delete寫錯了

    結果 :插入成功!

    沒有進行事務的管理;我們想讓他們都成功才成功,有一個失敗,就都失敗,我們就應該需要事務!

    以前我們都需要自己手動管理事務,十分麻煩!

    但是Spring給我們提供了事務管理,我們只需要配置即可;

spring中的事務管理

Spring在不同的事務管理API之上定義了一個抽象層,使得開發人員不必了解底層的事務管理API就可以使用Spring的事務管理機制。Spring支持編程式事務管理和聲明式的事務管理

  • 聲明式事務:

    • 一般情況下比編程式事務好用。

    • 將事務管理代碼從業務方法中分離出來,以聲明的方式來實現事務管理。

    • 將事務管理作為橫切關注點,通過aop方法模塊化。Spring中通過Spring AOP框架支持聲明式事務管理。

  • 編程式事務:

    • 將事務管理代碼嵌到業務方法中來控制事務的提交和回滾

    • 缺點:必須在每個事務操作業務邏輯中包含額外的事務管理代碼

使用Spring管理事務,注意頭文件的約束導入 : tx

?xmlns:tx="http://www.springframework.org/schema/tx"?http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd">

事務管理器

  • 無論使用Spring的哪種事務管理策略(編程式或者聲明式)事務管理器都是必須的。

  • 就是 Spring的核心事務管理抽象,管理封裝了一組獨立于技術的方法。

JDBC事務

?<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>

配置好事務管理器后我們需要去配置事務的通知

?<!--配置事務通知--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><!--配置哪些方法使用什么樣的事務,配置事務的傳播特性--><tx:method name="add" propagation="REQUIRED"/><tx:method name="delete" propagation="REQUIRED"/><tx:method name="update" propagation="REQUIRED"/><tx:method name="search*" propagation="REQUIRED"/><tx:method name="get" read-only="true"/><tx:method name="*" propagation="REQUIRED"/></tx:attributes></tx:advice>

spring事務傳播特性:

事務傳播行為就是多個事務方法相互調用時,事務如何在這些方法間傳播。spring支持7種事務傳播行為:

  • propagation_requierd:如果當前沒有事務,就新建一個事務,如果已存在一個事務中,加入到這個事務中,這是最常見的選擇。

  • propagation_supports:支持當前事務,如果沒有當前事務,就以非事務方法執行。

  • propagation_mandatory:使用當前事務,如果沒有當前事務,就拋出異常。

  • propagation_required_new:新建事務,如果當前存在事務,把當前事務掛起。

  • propagation_not_supported:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

  • propagation_never:以非事務方式執行操作,如果當前事務存在則拋出異常。

  • propagation_nested:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作

Spring 默認的事務傳播行為是 PROPAGATION_REQUIRED,它適合于絕大多數的情況。

假設 ServiveX#methodX() 都工作在事務環境下(即都被 Spring 事務增強了),假設程序中存在如下的調用鏈:Service1#method1()->Service2#method2()->Service3#method3(),那么這 3 個服務類的 3 個方法通過 Spring 的事務傳播機制都工作在同一個事務中。

就好比,我們剛才的幾個方法存在調用,所以會被放在一組事務當中!

配置AOP

導入aop的頭文件!

?<!--配置aop織入事務--><aop:config><aop:pointcut id="txPointcut" expression="execution(* com.kuang.dao.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/></aop:config>

進行測試

刪掉剛才插入的數據,再次測試!

?@Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");UserMapper mapper = (UserMapper) context.getBean("userDao");List<User> user = mapper.selectUser();System.out.println(user);}

思考問題?

為什么需要配置事務?

  • 如果不配置,就需要我們手動提交控制事務;

  • 事務在項目開發過程非常重要,涉及到數據的一致性的問題,不容馬虎!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76686.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76686.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kotlin 學習-集合

/*** kotlin 集合* List:是一個有序列表&#xff0c;可通過索引&#xff08;下標&#xff09;訪問元素。元素可以在list中出現多次、元素可重復* Set:是元素唯一的集合。一般來說 set中的元素順序并不重要、無序集合* Map:&#xff08;字典&#xff09;是一組鍵值對。鍵是唯一的…

WPF 五子棋項目文檔

WPF 五子棋項目文檔 1. 項目概述 本項目是一個使用 Windows Presentation Foundation (WPF) 技術棧和 C# 語言實現的桌面版五子棋&#xff08;Gomoku&#xff09;游戲。它遵循 MVVM&#xff08;Model-View-ViewModel&#xff09;設計模式&#xff0c;旨在提供一個結構清晰、可…

計算機操作系統——死鎖(詳細解釋和處理死鎖)

系列文章目錄 計算機操作系統-計算機系統中的死鎖 文章目錄 系列文章目錄前言一、資源問題&#xff1a; 計算機系統當中的死鎖&#xff1a; 二、死鎖的定義、必要條件和處理方法&#xff1a; 1.死鎖的定義&#xff1a;2.產生死鎖的必要條件&#xff1a;3.處理死鎖的方法&#…

Springboot項目正常啟動,訪問資源卻出現404錯誤如何解決?

我在自己的springboot項目中的啟動類上同時使用了SprinBootApplication和ComponentScan注解, 雖然項目能夠正常啟動,但是訪問資源后,返回404錯誤,隨后在啟動類中輸出bean,發現controller創建失敗: 而后我將ComponentScan去掉后資源就能訪問到了. 原因 SprinBootApplication本身…

第十五屆藍橋杯C/C++B組省賽真題講解(分享去年比賽的一些真實感受)

試題A——握手問題 一、解題思路 直接用高中學的排列組合思路 二、代碼示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…

動態規劃(6)——01背包問題

歡迎來到博主的專欄&#xff1a;算法解析 博主ID&#xff1a;代碼小號 文章目錄 牛客網——【模板】01背包題目解析題目1算法原理題目1題解代碼。問題2算法原理問題2題解代碼01背包問題的滾動數組優化 牛客網——【模板】01背包 題目解析 關于I/O相關的東西博主就不多贅述了&a…

TQTT_KU5P開發板教程---實現流水燈

文檔實現功能介紹 本文檔是學習本開發板的基礎&#xff0c;通過設置計數器使led0到led7依次閃爍&#xff0c;讓用戶初步認識vivado基本的開發流程以及熟悉項目的創建。本開發板的所有教程所使用的軟件都是vivado2024.1版本的。可以根據網上的教程下載與安裝。 硬件資源 此次教程…

Spring 中的 @Cacheable 緩存注解

1 什么是緩存 第一個問題&#xff0c;首先要搞明白什么是緩存&#xff0c;緩存的意義是什么。 對于普通業務&#xff0c;如果要查詢一個數據&#xff0c;一般直接select數據庫進行查找。但是在高流量的情況下&#xff0c;直接查找數據庫就會成為性能的瓶頸。因為數據庫查找的…

SEER: Self-Aligned Evidence Extraction for Retrieval-AugmentedGeneration

一、動機 如何從檢索到的段落中提取證據&#xff0c;以降低計算成本并提升最終的RAG性能&#xff0c;然而這一問題仍然具有挑戰性。 現有方法 嚴重依賴于基于啟發式的增強&#xff0c;面臨以下幾個問題&#xff1a; &#xff08;1&#xff09;由于手工制作的上下文過濾&…

毫米波測試套裝速遞!高效賦能5G/6G、新材料及智能超表面(RIS)研發

德思特&#xff08;Tesight&#xff09;作為全球領先的測試測量解決方案提供商&#xff0c;始終致力于為前沿技術研發提供高精度、高效率的測試工具。 針對毫米波技術在高頻通信、智能超表面&#xff08;RIS&#xff09;、新材料等領域的快速應用需求&#xff0c;我們推出毫米…

三維激光測量助力企業檢測效率提升3倍

智能制造與數字化浪潮席卷下&#xff0c;三維掃描技術已成為工業檢測領域不可或缺的工具。面對傳統檢測手段的精度瓶頸與效率局限&#xff0c;三維掃描儀&#xff0c;以毫米級精度、非接觸式測量與超高速掃描三大核心優勢&#xff0c;為汽車制造、航空航天、消費電子等行業的品…

SQL:Normalization(范式化)

目錄 Normalization&#xff08;范式化&#xff09; 為什么需要 Normalization&#xff1f; &#x1f9e9; 表格分析&#xff1a; 第一范式&#xff08;1NF&#xff09; 什么是第一范式&#xff08;First Normal Form&#xff09;&#xff1f; 第二范式&#xff08;2NF&am…

#MES系統運維問題分析思路

一套適用于90% MES運維現場問題的排查分析思維模型&#xff0c;叫做&#xff1a; &#x1f50d; MES系統問題分析七步法&#xff08;現場實戰適用&#xff09; ? 第一步&#xff1a;明確問題現象&#xff08;What&#xff09; 問題要說清楚&#xff0c;“不能操作”這種模糊描…

達夢數據庫-學習-18-ODBC數據源配置(Linux)

一、環境信息 名稱值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系統CentOS Linux release 7.9.2009 (Core)內存4G邏輯核數2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…

js 效果展示 拿去練手

自學完整功能&#xff0c;拿去練手。 鼠標移動放大 通過網盤分享的文件&#xff1a;圖片放大 鏈接: https://pan.baidu.com/s/1w8SjtKi4kUNDnZtRDfYMeQ?pwd95p6 提取碼: 95p6 通過網盤分享的文件&#xff1a;圖片動畫效果 鏈接: https://pan.baidu.com/s/1Pjphx-Cc4HQQNNujr…

使用 TFIDF+分類器 范式進行企業級文本分類(二)

1.開場白 上一期講了 TF-IDF 的底層原理&#xff0c;簡單講了一下它可以將文本轉為向量形式&#xff0c;并搭配相應分類器做文本分類&#xff0c;且即便如今的企業實踐中也十分常見。詳情請見我的上一篇文章 從One-Hot到TF-IDF&#xff08;點我跳轉&#xff09; 光說不練假把…

硬件設計-MOS管快速關斷的原因和原理

目錄 簡介&#xff1a; 來源&#xff1a; MOS管快關的原理 先簡單介紹下快關的原理&#xff1a; 同電阻時為什么關斷時間會更長 小結 簡介&#xff1a; 本章主要介紹MOS快速關斷的原理和原因。 來源&#xff1a; 有人會問&#xff0c;會什么要求快速關斷&#xff0c;而…

Linux進階命令

目錄 一、touch 1. 基本語法 2. 常用選項 二、which 1. 基本語法 2. 主要功能 3. 常用選項 三、find 1. 基本語法 2. 常用選項和表達式 四、more 1. 基本語法 2. 常用操作 3. 對比 more 和 less 五、grep 1. 基本語法 2. 常用選項 六、wc 1. 基本語法 2. 常…

阿里云實時計算Flink版產品體驗測評

阿里云實時計算Flink版產品體驗測評 什么是阿里云實時計算Flink應用場景實時計算Flink&自建Flink集群性價比開發效率運維管理企業安全 場景落地 什么是阿里云實時計算Flink 實時計算Flink大家可能并不陌生&#xff0c;在實時數據處理上&#xff0c;可能會有所接觸&#xf…

用戶登錄不上linux服務器

一般出現這種問題&#xff0c;重新用root用戶修改lsy用戶的密碼即可登錄&#xff0c;但是當修改了還是登錄不了的時候&#xff0c;去修改一個文件用root才能修改&#xff0c; 然后在最后添加上改用戶的名字&#xff0c;例如 原本是只有user的&#xff0c;現在我加上了lsy了&a…