Spring事務管理
Spring 事務管理機制
事務的概念和特性
事務:一起成功、一起失敗
什么是事務呢?
事務指的是邏輯上的一組操作,這組操作要么全部成功,要么全部失敗
事務的特性:
原子性、一致性、隔離性、持久性
原子性:原子性是值事務是一個不可分割的工作單位,事務中的操作要么都發生,要么都不發生
一致性:一致性指事務前后數據的完整性必須保持一致
隔離性:隔離性是指多個用戶并發訪問數據庫時,一個用戶的事務不能被其他用戶的事務所干擾,多個并發事務之間數據要相互隔離。
持久性:一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,即使數據庫發生故障也不應該對其有任何影響。
如果不考慮隔離性,會引發安全問題如下:
臟讀、不可重復讀、幻讀
臟讀:一個事務讀取了另一個事務改寫但還未提交的數據,如果這些數據被回滾,則讀到的數據是無效的。
不可重復讀:在同一事務中,多次讀取同一數據返回的結果有所不同。
幻讀:一個事務讀取了幾行記錄后,另一個事務插入一些記錄,幻讀就發生了,再后來的查詢中,第一個數據就會發現有些原來沒有的記錄
Spring接口介紹
Spring事務管理高層首相主要包括三個接口
PlatformTransactionManager
平臺事務管理器
TransactionDefinition
事務定義信息(隔離、傳播、超時、只讀)
TransactionStatus
事務具體運行狀態
平臺事務管理器
事務的四種隔離級別
MySql默認的事務隔離級別為REPEATABLE_READ
Oracle默認的事務隔離級別為READ_COMMITTED
spring 事務的七種傳播行為
什么是事務的傳播行為?
事務有哪些傳播行為?
重點記第一個PROPAGATION_REQUIRED、第四個PROPAGATION_REQUIRES_NEW、和最后一個PROPAGATION_NESTED
Spring事務管理
Spring支持兩種方式
1.編程式的事務
在實際應用中很少使用
通過TransactionTemplate手動管理事務
2.使用xml配置聲明式事務
開發中推薦使用(代碼侵入性最小)
Spring的聲明式事務是通過AOP實現的
Spring事務管理的實現
描述:在ssm環境下,以簡單的轉賬案例,分別使用編程式事務管理、以及聲明式事務管理來實現Spring事務管理。
創建數據庫表
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`money` double DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `account` VALUES ('1', 'aaa', '1000');
INSERT INTO `account` VALUES ('2', 'bbb', '1000');
INSERT INTO `account` VALUES ('3', 'ccc', '1000');
編寫AccountDaO層
package com.mavenssmlr.dao;
import org.apache.ibatis.annotations.Param;
/**
* 轉賬案例的Dao層的接口
* Created by shirukai on 2017/11/1.
*/
public interface AccountDao {
/**
*
* @param out 轉出賬號
* @param money 轉出金額
*/
public void outMoney(@Param("out") String out,@Param("money") Double money);
/**
*
* @param in 轉入賬號
* @param money 轉入金額
*/
public void inMoney(@Param("in") String in,@Param("money") Double money);
}
編寫 AccountDaoMappper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mavenssmlr.dao.AccountDao">
<update id="outMoney">
UPDATE mavenssmlr.account SET money = money - #{money} WHERE name = #{out}
</update>
<update id="inMoney">
UPDATE mavenssmlr.account SET money = money+ #{money} WHERE name = #{in}
</update>
</mapper>
編寫Service接口
/**
* 轉賬案例的業務接口
* @param out 轉出的賬號
* @param in 轉入的賬號
* @param money 轉賬金額
*/
Map<String,String> transfer(String out ,String in ,Double money);
編寫Service接口實現類
public Map<String, String> transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
accountDao.inMoney(in, money);
return null;
}
編寫service測試類
@Test
public void accountTest()throws Exception{
mavenssmlrService.transfer("aaa","bbb",200d);
}
以上基本的轉賬案例就寫完了,但是沒有加入事務管理。
一、基于編程式的事務管理
Spring-service.xml
配置事務管理器
<!--配置事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入數據庫連接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
配置事務管理模板
<!--配置事務管理的模板:Spring為了簡化事務管理的代碼而提供的類-->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
service實現類
注入編程事務模板
//注入編程式事務模板
@Autowired
private TransactionTemplate transactionTemplate;
編程式事務方法
public Map<String, String> transfer(final String out,final String in,final Double money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
accountDao.outMoney(out, money);
//制造異常
int i = 1 / 0;
accountDao.inMoney(in, money);
}
});
return null;
}
測試類 無需改動
@Test
public void accountTest()throws Exception{
mavenssmlrService.transfer("aaa","bbb",200d);
}
二、基于聲明式的事務管理
1.基于TransactionProxy的聲明式事務管理
Spring-service.xml
配置事務管理器
<!--配置事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入數據庫連接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
配置業務代理
<!--配置業務代理:-->
<bean id="accountServiceProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--配置目標對象-->
<property name="target" ref="mavenssmlrServiceImpl"/>
<!--注入事務管理器-->
<property name="transactionManager" ref="transactionManager"/>
<!--注入事務屬性-->
<property name="transactionAttributes">
<props>
<!--prop的格式
* PROPAGATION :事務的傳播行為
* ISOLATION :事務的隔離級別
* readOnly :只讀
* -Exception :發生哪些異常回滾事務
* +Exception :發生哪些以上不回滾事務
-->
<prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
service實現類
public Map<String, String> transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
//制造異常
int i = 1 / 0;
accountDao.inMoney(in, money);
return null;
}
測試類 需要引入Service的增強類
@Resource(name = "accountServiceProxy")
private MavenssmlrService mavenssmlrService;
@Test
public void accountTest()throws Exception{
mavenssmlrService.transfer("aaa","bbb",200d);
}
2.基于AspectJ的xml配置聲明式事務(沒有實現)
<!--配置事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入數據庫連接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--2)配置事務的通知(事務的增強)-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
propagation :事務傳播行為
isolation :事務的隔離級別
read-only :只讀
rollback-for:發生哪些異常回滾
no-rollback-for :發生哪些異常不回滾
timeout :過期信息
-->
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入點 -->
<aop:pointcut expression="execution(* com.mavenssmlr.service.MavenssmlrService+.*(..))" id="pointcut1"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
3.基于注解的聲明式事務
Spring-service.xml
<!--配置事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入數據庫連接池-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--2配置基于注解的聲明式事務-->
<tx:annotation-driven transaction-manager="transactionManager"/>
在方法上添加@Transactional
/**
*
* @param out 轉出的賬號
* @param in 轉入的賬號
* @param money 轉賬金額
* @return
*
* Transactional注解中的屬性
* propagation:事務的傳播行為
* isolation:隔離基本
* readOnly:只讀信息
* rollbackFor:發生哪些異常回滾
* noRollbackFor:發生哪些異常不回滾
*/
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
public Map<String, String> transfer(String out, String in, Double money) {
accountDao.outMoney(out, money);
//制造異常
int i = 1 / 0;
accountDao.inMoney(in, money);
return null;
}
總結:
Spring將事務管理分成了兩類
編程式事務管理
手動編寫代碼進行事務管理(很少使用)
聲明式事務管理
基于TransactionProxyFactoryBean(很少使用)
基于AspectJ的XMl方式
基于注解方式(經常使用)
?
智能推薦
Spring 事務管理
案例—轉賬操作 創建一個關于轉賬的帳戶表 創建service與dao 對于數據的操作使用spring jdbc template Service層和Dao層代碼 Dao接口 Dao實現類 Service接口 Service實現類 測試類 service與dao的配置 數據庫配置文件db.properties 我們讓dao去extends JdbcDaoSupport類,這個類中它創建了...
Spring 事務管理
1.事務(編程式事務)(聲明式事務) 1.什么是事務? 把一組業務當做一個事務來做,要么成功,要么失敗!事務在項目開發中,十分重要,涉及到數據的一致性問題和完整性 2.事務ACID原則 原子性 一致性 隔離性:多個可能操作同一個資源,防止數據損壞 持久性:事務一旦提交,無論系統發生什么問題,結果都不會被影響,被持久化的寫到存儲器中 2 Spring中的事務管理 聲明式事務:AOP 編程式事務:需要...
Spring 事務管理
事務管理接口 編程式事務管理(基于Java編程控制,很少使用) 利用TransactionTemplate將多個DAO操作封裝起來 聲明式事務管理(基于Spring的AOP配置控制) 基于TransactionProxyFactoryBean的方式.(很少使用) 需要為每個進行事務管理的類,配置一個Transa...
Spring 事務管理
一、spring的事務管理 1.事物的概念: 事務管理是企業級應用程序開發中必不可少的技術, 用來確保數據的完整性和一致性。 事務就是一系列的動作, 它們被當作一個單獨的工作單元. 這些動作要么全部完成, 要么全部不起作用。 2.事務的屬性 事務的4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。 原子性(atomicity): 事務是一個原子操作, 由一系列動作組成. 事...
Spring 事務管理
事務實現方式 在Spring中,事務有兩種實現方式,分別是編程式事務管理和聲明式事務管理兩種方式。 編程式事務管理: 編程式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于編程式事務管理,spring推薦使用TransactionTemplate。 聲明式事務管理: 建立在AOP之上的。其本質是對方法前后進行攔截,然后在...
猜你喜歡
Spring事務管理
事務 就是把一系列的動作當成一個獨立的工作單元,這些動作要么全部完成,要么全部不起作用。 事務四個屬性ACID 原子性(atomicity) 事務是原子性操作,由一系列動作組成,事務的原子性確保動作要么全部完成,要么完全不起作用 一致性(consistency) 一旦所有事務動作完成,事務就要被提交。數據和資源處于一種滿足業務規則的一致性狀態中 隔離性(isolation) 可能多個事務會同時處理...
Spring:事務管理
文章目錄 2、事務管理 1、事務的隔離級別? 1、事務概念 2、事務的四大特性 3、事務的隔離級別 2、Spring 事務的傳播行為? 1、接口介紹 2、事務的傳播特性 3、Spring業務層不使用事務 4、Spring編程式事務 5、Spring聲明式事務 1、基于TransactionProxyFactoryBean的方式 2、基于Aspetj的xml方式 3、基于注解的方式 2、事務管理 1...
spring事務管理
spring事務管理的兩種方式 第一種,編程式事務管理 第二種,聲明式事務管理 基于xml配置文件實現 基于注解實現 spring事務管理的api 接口:PlatformTransactionManager事務管理器 - 針對不同的dao層的框架,提供了這個接口不同的實現類 - 首先要配置事務管理器 轉賬案例 dao層 service層: 如果沒有事務管理,a賬戶余額減少,但是b賬戶余額并沒有增加...
Spring 事務管理
事務的定義 事務是一個操作集合,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。 事務的特性 在一個事務性操作的環境下,操作有著以下的4種特性,被稱為ACID特性: 原子性(Atomicity):當事務結束,它對所有資源狀態的改變都被視為一個操作,這些操作要不同時成功,要不同時失敗; 一致性(Consistency):操作完成后,所有數據必須符合業務規則,否則事務必須中止; 隔離性(...