Spring 框架基礎(05):事務管理機制,和實現方式
本文原始碼:GitHub·點這裡 || GitEE·點這裡
一、Spring事務管理
1、基礎描述
Spring
事務管理的本質就是封裝了資料庫對事務支援的操作,使用JDBC的事務管理機制,就是利用java.sql.Connection
物件完成對事務的提交和回滾。
Connection conn = DriverManager.getConnection(); try { // 自動提交設定為false conn.setAutoCommit(false); // 執行增刪改查操作 // 當操作成功後手動提交 conn.commit(); } catch (Exception e) { // 出現異常,回滾所有操作 conn.rollback(); e.printStackTrace(); } finally { conn.colse(); }
2、事務常見概念
- 事務
事務是指作為單個邏輯工作單元執行的一系列操作(SQL語句)。這些操作要麼全部成功,要麼全部不成功。
- 特性:ACID
原子性(Atomicity):事務中的多個操作要麼都成功要麼都失敗
一致性(consistency):事務的執行的前後資料的完整性保持一致
隔離性(isolation):事務執行的過程中,不應該受到其他事務的干擾
永續性(durability):事務一旦結束,資料就持久到資料庫
- 隔離問題
髒讀:一個事務讀到另一個事務沒有提交的資料
不可重複讀:一個事務前後多次讀取相同資料,資料內容不一致,update場景問題
虛讀(幻讀):一個事務前後多次讀取,資料總量不一致,insert場景問題
- 隔離級別
read uncommitted
:
事務可以讀取另一個未提交事務的資料。
read committed
:
事務要等另一個事務提交後才能讀取資料,解決髒讀。
repeatable read
:
在開始讀取資料時,事務開啟,不再允許修改操作,解決:髒讀、不可重複讀。
serializable
:
最高事務隔離級別,事務序列化順序執行,解決髒讀、不可重複讀、幻讀。但是效率低下,耗資料庫效能。
3、事務管理API描述
PlatformTransactionManager
平臺事務管理器,Spring管理事務,必須使用事務管理器進行事務配置時,核心方法:獲取事務,提交事務,回滾事務。
TransactionDefinition
該物件封裝事務詳情(事務定義、事務屬性),例如:隔離級別、是否只讀、超時時間 等。
TransactionStatus
用於記錄當前事務執行狀態。例如:是否有儲存點,事務是否完成。Spring底層根據狀態進行相應操作。
4、事務案例SQL語句
CREATE TABLE user_account(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
money INT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;;
INSERT INTO user_account(username,money) VALUES('jack','5000');
INSERT INTO user_account(username,money) VALUES('tom','5000');
SELECT * FROM user_account ;
二、程式設計式事務管理
1、核心配置檔案
<!-- 配置事物管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 建立事物模板 -->
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="txManager" />
</bean>
<!-- 配置轉賬介面 -->
<bean id="userAccountService"
class="com.spring.mvc.service.impl.UserAccountServiceImpl">
<property name="jdbcTemplate" ref="jdbcTemplate" />
<property name="transactionTemplate" ref="transactionTemplate" />
</bean>
2、演示案例
@Service
public class UserAccountServiceImpl extends JdbcDaoSupport implements UserAccountService {
// 注入事物模板
private TransactionTemplate transactionTemplate ;
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
@Override
public void remittance(String remitTer, String receiver, int money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus arg0) {
outMoney(remitTer,money);
// System.out.println(1/0);
innerMoney(receiver,money);
}
});
}
private void outMoney (String remitTer, int money){
String outSql = "update user_account set money = money - ? where username = ?";
this.getJdbcTemplate().update(outSql, money ,remitTer);
}
private void innerMoney (String receiver, int money){
String inSql = "update user_account set money = money + ? where username = ?";
this.getJdbcTemplate().update(inSql, money,receiver);
}
}
三、事務代理工廠
1、核心配置
<!-- 配置轉賬介面 -->
<bean id="userAccountService01"
class="com.spring.mvc.service.impl.UserAccountServiceImpl01">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 配置事務代理工廠 -->
<bean id="proxyAccountService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces" value="com.spring.mvc.service.UserAccountService01" />
<property name="target" ref="userAccountService01" />
<property name="transactionManager" ref="txManager" />
<property name="transactionAttributes">
<props>
<!-- 預設傳播行為、隔離級別 -->
<prop key="remittance">PROPAGATION_REQUIRED,ISOLATION_DEFAULT</prop>
<!-- 異常仍然提交事務
<prop key="remittance">PROPAGATION_REQUIRED,ISOLATION_DEFAULT,+java.lang.Exception</prop>
-->
</props>
</property>
</bean>
配置說明:
proxyInterfaces
代理介面target
代理目標類transactionManager
事務管理器transactionAttributes
事務屬性(事務詳情)prop.key
指定方法使用當前事務配置
事務行為:
PROPAGATION
傳播行為ISOLATION
隔離級別readOnly
是否只讀-Exception
異常回滾+Exception
異常提交
2、演示案例
@Service
public class UserAccountServiceImpl01 extends JdbcDaoSupport implements UserAccountService01 {
@Override
public void remittance(String remitTer, String receiver, int money) {
outMoney(remitTer,money);
System.out.println(1/0);
innerMoney(receiver,money);
}
private void outMoney (String remitTer, int money){
String outSql = "update user_account set money = money - ? where username = ?";
this.getJdbcTemplate().update(outSql, money ,remitTer);
}
private void innerMoney (String receiver, int money){
String inSql = "update user_account set money = money + ? where username = ?";
this.getJdbcTemplate().update(inSql, money,receiver);
}
}
3、測試程式碼
public class Tx_Test_02 {
@Test
public void test1 (){
String xmlPath = "spring-jdbc-tx-02.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);
UserAccountService01 accountService = (UserAccountService01)
context.getBean("proxyAccountService");
accountService.remittance("jack","tom",1000);
}
}
四、XML配置事務
首先配置事務管理器,然後配置事務屬性,最後基於AOP程式設計配置事務切入點。
1、核心配置
<!-- 配置事物管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置轉賬介面 -->
<bean id="userAccountService01"
class="com.spring.mvc.service.impl.UserAccountServiceImpl01">
<property name="jdbcTemplate" ref="jdbcTemplate" />
</bean>
<!-- 配置事物詳情 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="remittance"
propagation="REQUIRED"
isolation="DEFAULT"/>
</tx:attributes>
</tx:advice>
<!-- 事務切入點,基於AOP程式設計 -->
<aop:config>
<aop:advisor
advice-ref="txAdvice"
pointcut="execution(* com.spring.mvc.service.UserAccountService01.*(..))"/>
</aop:config>
五、基於事務註解
配置事務管理器,並啟動事務註解的支援,在目標類或目標方法新增@Transactional
核心註解即可。
1、核心配置
<!-- 配置事物管理器 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 支援事務註解 -->
<tx:annotation-driven transaction-manager="txManager" />
2、註解用法
註解寫在介面方法上,或者介面實現的方法上效果一樣。
public interface UserAccountService02 {
@Transactional(rollbackFor = Exception.class)
void remittance(String remitTer, String receiver, int money) ;
}
六、原始碼地址
GitHub·地址
https://github.com/cicadasmile/spring-mvc-parent
GitEE·地址
https://gitee.com/cicadasmile/spring-mvc-parent
相關推薦
Spring 框架基礎(05):事務管理機制,和實現方式
本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Spring事務管理 1、基礎描述 Spring事務管理的本質就是封裝了資料庫對事務支援的操作,使用JDBC的事務管理機制,就是利用java.sql.Connection物件完成對事務的提交和回滾。 Connection conn = Drive
Spring 框架基礎(01):核心元件總結,基礎環境搭建
本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Spring框架 1、框架簡介 Spring是一個開源框架,框
SSH:Spring框架(宣告式事務管理詳解)
1) 概念:事務 (Transaction) 是訪問並可能更新資料庫中各種資料項的一個程式執行單元 (unit) 。事務通常由高階資料 庫操縱語言或程式語言 (如 SQL , C++ 或 Java ) 書寫的使用者程式的執行所引起, 並用形如 begin transacti
Spring Boot 2.x基礎教程:事務管理入門
## 什麼是事務? 我們在開發企業應用時,通常業務人員的一個操作實際上是對資料庫讀寫的多步操作的結合。由於資料操作在順序執行的過程中,任何一步操作都有可能發生異常,異常會導致後續操作無法完成,此時由於業務邏輯並未正確的完成,之前成功操作的資料並不可靠,如果要讓這個業務正確的執行下去,通常有實現方式: 1.
深入理解spring的事務管理機制及程式碼實現
Spring的事務管理機制 Spring事務管理高層抽象主要包括3個介面,Spring的事務主要是由他們共同完成的: PlatformTransactionManager:事務管理器—主要用於平臺相關事務的管理 TransactionDefinition: 事務定義資訊(隔
深入學習Spring框架(四)- 事務管理
1.什麼是事務? 事務(Transaction)是一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位,是資料庫環境中的邏輯工作單位。事務是為了保證資料庫的完整性。例如:A給B轉賬,需要先減掉A的賬戶餘額再加到B的賬戶上,這兩個操作是一個整體,不可能扣掉A的錢不給B加上,或者只給B加沒有
Spring 框架基礎(03):核心思想 IOC 說明,案例演示
本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、IOC控制反轉 1、IOC容器思想 Java系統中物件耦合關係
Spring 框架基礎(02):Bean的生命週期,作用域,裝配總結
本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、裝配方式 Bean的概念:Spring框架管理的應用程式中,由
Spring 框架基礎(06):Mvc架構模式簡介,執行流程詳解
本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、SpringMvc框架簡介 1、Mvc設計理念 MVC是一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個元件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯,MVC分層有助於管理和架
基於Spring框架應用的許可權控制系統的研究和實現
摘 要: Spring框架是一個優秀的多層J2EE系統框架,Spring本身沒有提供對系統的安全性支援。Acegi是基於Spring IOC 和 AOP機制實現的一個安全框架。本文探討了Acegi安全框架中各部件之間的互動,並通過擴充套件Acegi資料庫設計來實現基於Spring框架的應用的安全控制方法。
限界分支法(實際上沒有剪枝,介紹的是廣度優先搜尋):01揹包問題,佇列實現方式(FIFO)
限界分支法:佇列實現方式 前面已經介紹過限界分支法大部分是基於廣度優先搜尋,廣度優先搜尋一般藉助於佇列實現,剪枝的情況可以藉助於優先順序佇列。 實現如下: #%% class FIFO_01_Pack: def __init__(self,N,V,C,W):
Java進階學習第二十四天(Spring框架:事務管理、Spring與Hibernate整合)
一、事務控制 1、引入 使用者訪問 > Action > Service > Dao 如何保證: 在service中呼叫2次dao,其中一個dao執行失敗,整個操作要回滾 2、事務控制概述 ① 程式設計式事務控制:自己手動控制事務 Jdbc程式
MySQL基礎篇(06):事務管理,鎖機制案例詳解
本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile/mysql-data-base) || [GitEE·點這裡](https://github.com/cicadasmile/mysql-data-base) # 一、鎖概念簡介 ## 1、基礎描述 鎖
Spring事務管理機制入門(一)
黑馬程式設計師Spring事務管理機制視訊學習筆記,視訊教程的內容用來入門,為了深入掌握,後面會對學習的內容進行原始碼解析、設計思想剖析、事務的本質的探索、對生活和人生的啟示一一道來,爭取做到,學就要學透,不要為了學習而學習。 Spring事務管理機制 主要內容:
第三天 : 事務管理 、 三大框架整合開發
事務管理 、 三大框架整合開發 目錄 一、Spring事務管理 1、 事務管理相關API 2、 PlatformTransactionManager 介面詳解 1) 不同平臺事務管理器實現 2) TransactionDefinition 事務隔離級別 3)
[轉]Spring 事務管理機制
摘要: 一般地,使用者的每次請求都對應一個業務邏輯方法,而一個業務邏輯方法往往包括一系列資料庫原子訪問操作,並且這些資料庫原子訪問操作應該繫結成一個事務來執行。然而,在使用傳統的事務程式設計策略時,程式程式碼必然和具體的事務操作程式碼耦合,而使
8.spring:事務管理(上):Spring的資料庫程式設計、程式設計式事務管理
Spring的資料庫程式設計 Spring框架提供了JDBC模板模式------>JdbcTemplate 簡化了開發,在開發中並不經常是使用 實際開發更多使用的是Hibernate和MyBatis 1).Spring JDBCp配置 如果使用Spring JDBC操作資料庫,要有
9.spring:事務管理(下):宣告式事務管理
宣告式事務管理 sprin的宣告式事務是管理AOP技術實現的事務管理,其本質是是對方法前後進行攔截,然後 在目標方法開始之前建立或者加入一個事務,在執行完成目標方法之後根據執行情況提交或者回滾事務。 宣告式事務管理優點:不需要通過程式設計的方式管理事務,因而不需要在業務邏輯程
Spring事務管理機制的實現原理-動態代理
之前在做專案中遇到spring無法進行事務代理問題,最後發現是因為沒有寫介面,原因當時明白了,看到這篇文章寫的清楚些,轉過來 我們先來分析一下Spring事務管理機制的實現原理。由於Spring內建AOP預設使用動態代理模式實現,我們就先來分析一下動態代理模式的實現方 法。動態代理模式的核心就在於程
Spring4的知識應用總結(六)——Spring事務管理機制
Spring中的事務管理一、事務簡介 事務管理是企業級應用程式開發中必不可少的技術, 用來確保資料的完整性和一致性. 事務就是一系列的動作, 它們被當做一個單獨的工作單元. 這些動作要麼