成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring 事務還能這樣管理?

開發 架構
在實際開發中,操作數據庫時都會涉及到事務管理問題,為此Spring提供了專門用于事務處理的API。Spring的事務管理簡化了傳統的事務管理流程,并且在一定程度上減少了開發者的工作量。

[[431979]]

本文轉載自微信公眾號「程序員千羽」,作者程序員千羽。轉載本文請聯系程序員千羽公眾號。

GitHub:https://github.com/nateshao/ssm/tree/master/105-spring-transaction

1.Spring事務管理概述

什么是Spring的事務管理?

在實際開發中,操作數據庫時都會涉及到事務管理問題,為此Spring提供了專門用于事務處理的API。Spring的事務管理簡化了傳統的事務管理流程,并且在一定程度上減少了開發者的工作量。

Spring事務管理的三個核心接口。

在該JAR包的org.springframework.transaction包中,有3個接口文件PlatformTransactionManager、TransactionDefinition和TransactionStatus

事務管理的核心接口

Platform TransactionManager

PlatformTransactionManager接口是Spring提供的平臺事務管理器,主要用于管理事務。該接口中提供了三個事務操作的方法,具體如下:

  • TransactionStatus getTransaction(TransactionDefinition definition):用于獲取事務狀態信息
  • void commit(TransactionStatus status):用于提交事務
  • void rollback(TransactionStatus status):用于回滾事務

PlatformTransactionManager接口只是代表事務管理的接口,并不知道底層是如何管理事務的,具體如何管理事務則由它的實現類來完成。該接口常見的幾個實現類如下:

小提示:當底層采用不同的持久層技術時,系統只需使用不同的PlatformTransactionManager實現類即可。

TransactionDefinition

TransactionDefinition接口是事務定義(描述)的對象,該對象中定義了事務規則,并提供了獲取事務相關信息的方法,具體如下:

  • String getName( ); 獲取事務對象名稱
  • int getIsolationLevel( ); 獲取事務的隔離級別
  • int getPropagationBehavior( ); 獲取事務的傳播行為
  • int getTimeout( );獲取事務的超時時間
  • boolean isReadOnly( ); 獲取事務是否只讀

上述方法中,事務的傳播行為是指在同一個方法中,不同操作前后所使用的事務。傳播行為有很多種,具體如下表所示:

在事務管理過程中,傳播行為可以控制是否需要創建事務以及如何創建事務,通常情況下,數據的查詢不會影響原數據的改變,所以不需要進行事務管理,而對于數據的插入、更新和刪除操作,必須進行事務管理。如果沒有指定事務的傳播行為,Spring默認傳播行為是REQUIRED。

TransactionStatus

TransactionStatus接口是事務的狀態,它描述了某一時間點上事務的狀態信息。該接口中包含6個方法,具體如下:

  • void flush(); 刷新事務
  • boolean hasSavepoint(); 獲取是否存在保存點
  • boolean isCompleted(); 獲取事務是否完成
  • boolean isNewTransaction(); 獲取是否為新事務
  • boolean isRollbackOnly(); 獲取事務是否回滾
  • void setRollbackOnly(); 設置事務回滾

聲明式事務管理最大的優點在于開發者無需通過編程的方式來管理事務,只需在配置文件中進行相關的事務規則聲明,就可以將事務應用到業務邏輯中。這使得開發人員可以更加專注于核心業務邏輯代碼的編寫,在一定程度上減少了工作量,提高了開發效率,所以在實際開發中,通常都推薦使用聲明式事務管理。

2. 聲明式事務管理

如何實現Spring的聲明式事務管理?

Spring的聲明式事務管理可以通過兩種方式來實現, **一種是基于XML的方式,另一種是基于Annotation的方式。**接下來的兩個小節中,將對這兩種聲明式事務管理方式進行詳細講解。

基于XML方式的聲明式事務

配置< tx:advice >元素的重點是配置< tx:method >子元素,上圖中使用灰色標注的幾個屬性是< tx:method >元素中的常用屬性。其屬性描述具體如下:

Account.java

  1. @Data 
  2. public class Account { 
  3.     private Integer id;       // 賬戶id 
  4.     private String username; // 用戶名 
  5.     private Double balance;  // 賬戶余額 

AccountDao.java

  1. public interface AccountDao { 
  2.     ......... 
  3.     // 轉賬 
  4.     public void transfer(String outUser,String inUser,Double money); 

AccountDaoImpl.java

  1. @Transactional(propagation = Propagation.REQUIRED, 
  2.             isolation = Isolation.DEFAULT, readOnly = false
  3.     @Override 
  4.     public void transfer(String outUser, String inUser, Double money) { 
  5.         // 收款時,收款用戶的余額=現有余額+所匯金額 
  6.         this.jdbcTemplate.update("update account set balance = balance +? " 
  7.                 + "where username = ?",money, inUser); 
  8.         // 模擬系統運行時的突發性問題 
  9. //        int i = 1/0; 
  10.         // 匯款時,匯款用戶的余額=現有余額-所匯金額 
  11.         this.jdbcTemplate.update("update account set balance = balance-? " 
  12.                 + "where username = ?",money, outUser); 
  13.     } 

TransactionTest.java

  1. package com.nateshao.jdbc; 
  2.  
  3. import org.junit.jupiter.api.Test; 
  4. import org.springframework.context.ApplicationContext; 
  5. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  6.  
  7. /** 
  8.  * @date Created by 邵桐杰 on 2021/10/15 22:05 
  9.  * @微信公眾號 程序員千羽 
  10.  * @個人網站 www.nateshao.cn 
  11.  * @博客 https://nateshao.gitee.io 
  12.  * @GitHub https://github.com/nateshao 
  13.  * @Gitee https://gitee.com/nateshao 
  14.  * Description: 
  15.  */ 
  16. public class TransactionTest { 
  17.      @Test 
  18.     public void xmlTest() { 
  19.         ApplicationContext applicationContext = 
  20.                 new ClassPathXmlApplicationContext("applicationContext.xml"); 
  21.         // 獲取AccountDao實例 
  22.         AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDao"); 
  23.         // 調用實例中的轉賬方法 
  24.         accountDao.transfer("千羽""千尋", 100.0); 
  25.         // 輸出提示信息 
  26.         System.out.println("轉賬成功!"); 
  27.     } 

基于Annotation方式的聲明式事務

在Spring容器中注冊事務注解驅動;

  1. <tx:annotation-driven transaction-manager="transactionManager"/> 

在需要事務管理的類或方法上使用@Transactional注解。

如果將注解添加在Bean類上,則表示事務的設置對整個Bean類的所有方法都起作用;如果將注解添加在Bean類中的某個方法上,則表示事務的設置只對該方法有效。

使用@Transactional注解時,可以通過參數配置事務詳情:

applicationContext-annotation.xml

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <beans xmlns="http://www.springframework.org/schema/beans" 
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop" 
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xmlns:context="http://www.springframework.org/schema/context" 
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  8.     http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
  9.     http://www.springframework.org/schema/tx  
  10.     http://www.springframework.org/schema/tx/spring-tx-4.3.xsd 
  11.     http://www.springframework.org/schema/context  
  12.     http://www.springframework.org/schema/context/spring-context-4.3.xsd 
  13.     http://www.springframework.org/schema/aop  
  14.     http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"> 
  15.     <!-- 1.配置數據源 --> 
  16.     <bean id="dataSource"  
  17.     class="org.springframework.jdbc.datasource.DriverManagerDataSource"
  18.       <!--數據庫驅動 --> 
  19.       <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
  20.       <!--連接數據庫的url --> 
  21.       <property name="url" value="jdbc:mysql://localhost/spring?useSSL=false" /> 
  22.       <!--連接數據庫的用戶名 --> 
  23.       <property name="username" value="root" /> 
  24.       <!--連接數據庫的密碼 --> 
  25.       <property name="password" value="123456" /> 
  26.    </bean> 
  27.    <!-- 2.配置JDBC模板 --> 
  28.    <bean id="jdbcTemplate"  
  29.             class="org.springframework.jdbc.core.JdbcTemplate"
  30.       <!-- 默認必須使用數據源 --> 
  31.       <property name="dataSource" ref="dataSource" /> 
  32.    </bean> 
  33.    <!--3.定義id為accountDao的Bean --> 
  34.    <bean id="accountDao" class="com.nateshao.jdbc.AccountDaoImpl"
  35.       <!-- 將jdbcTemplate注入到AccountDao實例中 --> 
  36.       <property name="jdbcTemplate" ref="jdbcTemplate" /> 
  37.    </bean> 
  38.    <!-- 4.事務管理器,依賴于數據源 --> 
  39.    <bean id="transactionManager" class= 
  40.      "org.springframework.jdbc.datasource.DataSourceTransactionManager"
  41.       <property name="dataSource" ref="dataSource" /> 
  42.    </bean>     
  43.     <!-- 5.注冊事務管理器驅動 --> 
  44.    <tx:annotation-driven transaction-manager="transactionManager"/> 
  45. </beans> 

TransactionTest.java

  1. package com.nateshao.jdbc; 
  2.  
  3. import org.junit.jupiter.api.Test; 
  4. import org.springframework.context.ApplicationContext; 
  5. import org.springframework.context.support.ClassPathXmlApplicationContext; 
  6.  
  7. /** 
  8.  * @date Created by 邵桐杰 on 2021/10/15 22:05 
  9.  * @微信公眾號 程序員千羽 
  10.  * @個人網站 www.nateshao.cn 
  11.  * @博客 https://nateshao.gitee.io 
  12.  * @GitHub https://github.com/nateshao 
  13.  * @Gitee https://gitee.com/nateshao 
  14.  * Description: 
  15.  */ 
  16. public class TransactionTest { 
  17.     @Test 
  18.     public void annotationTest() { 
  19.         ApplicationContext applicationContext = 
  20.                 new ClassPathXmlApplicationContext("applicationContext-annotation.xml"); 
  21.         // 獲取AccountDao實例 
  22.         AccountDao accountDao = 
  23.                 (AccountDao) applicationContext.getBean("accountDao"); 
  24.         // 調用實例中的轉賬方法 
  25.         accountDao.transfer("千尋111""千羽111", 100.0); 
  26.         // 輸出提示信息 
  27.         System.out.println("轉賬成功!"); 
  28.     } 
  29.  

總結

本章主要對Spring中的事務管理進行了詳細講解。

  • 首先講解了Spring事務管理所涉及的3個核心接口,
  • 然后對Spring中事務管理的兩種方式進行了介紹,
  • 最后通過案例分別對基于XML方式和基于Annotation方式的聲明式事務處理的使用進行了詳細講解。 

通過本章的學習,我相信大家可以對Spring的事務管理知識有一定的了解,并能夠掌握Spring聲明式事務管理的使用。

 

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2024-07-10 11:26:18

2020-11-16 13:38:31

PostMessage

2021-07-28 06:10:47

拖拽設計器 transmat

2021-09-05 07:55:37

前端Emoji 表情

2020-09-14 11:26:54

BinlogCanal數據庫

2024-08-02 08:38:20

Controller接口地址

2012-07-13 11:32:16

網絡出口

2009-06-30 16:57:42

Spring事務管理

2023-10-08 08:28:10

Spring事務管理

2009-06-17 14:57:11

Spring事務管理

2024-05-13 00:47:37

JSON對象數據

2014-08-25 09:12:47

Spring事務管理

2009-06-08 17:56:00

SpringJDBC事務

2023-03-27 10:40:09

2009-02-11 11:14:31

事務管理事務開始Spring

2009-02-11 13:08:29

事務提交事務管理Spring

2024-01-30 09:21:29

CSS文字效果文字裝飾

2018-12-12 11:30:54

JavaString字符串

2021-04-09 08:23:30

Css前端加載動畫

2022-08-12 08:25:33

Python異常信息代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩美av | 黄色一级大片在线免费看产 | 久久久999精品| 亚洲免费人成在线视频观看 | 人人爽日日躁夜夜躁尤物 | 成人在线网址 | 丁香综合 | 精品一区二区在线观看 | 亚洲精品一区在线观看 | 日韩在线视频免费观看 | 黄片毛片免费观看 | 国产高清精品在线 | 国产精品毛片一区二区在线看 | 久草综合在线视频 | 二区中文字幕 | 欧美又大粗又爽又黄大片视频 | 久久久噜噜噜久久中文字幕色伊伊 | 在线a视频网站 | 91啪亚洲精品| 激情91| 日本午夜视频 | 中文字幕成人在线 | 精品一区二区久久久久久久网站 | 亚洲一区二区三区免费在线 | www日本在线播放 | 国产欧美在线一区二区 | 国产欧美日韩综合精品一区二区 | 久久免费香蕉视频 | 偷派自拍| 人人九九精 | 国产成人免费网站 | 丁香久久 | 亚洲人成一区二区三区性色 | 精品视频免费在线 | 国产精品福利在线观看 | 久久网一区二区 | 黄色欧美视频 | 日韩视频一区二区在线 | 91高清视频在线观看 | 黄色永久免费 | 91看片网 |