国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Spring事務(wù)管理

2019-11-11 01:37:58
字體:
供稿:網(wǎng)友

SPRing事務(wù)管理

@(Spring)[spring, 事務(wù)管理, 事務(wù), Spring]

Spring事務(wù)管理事務(wù)的基本概念什么是事務(wù)事務(wù)的特性事務(wù)的隔離性不完善引發(fā)的問題設(shè)置隔離級別解決讀問題Spring的事務(wù)管理Spring事務(wù)管理的APISpring的事務(wù)傳播行為Spring的事務(wù)管理案例環(huán)境搭建Spring的事務(wù)管理的分類創(chuàng)建相關(guān)接口和類并配置注解配置Spring在DAO中使用JDBC的模板編寫測試類Spring的聲明式事務(wù)管理xml方式的聲明式事務(wù)配置事務(wù)管理器配置一個事務(wù)通知配置AOPtxmethod的配置注解方式的聲明式事務(wù)配置事務(wù)管理器開啟注解事務(wù)在業(yè)務(wù)層添加一個事務(wù)的注解Transactional的配置Spring的編程式事務(wù)管理配置事務(wù)管理器配置事務(wù)管理的模板簡化事務(wù)開發(fā)在業(yè)務(wù)層注入事務(wù)管理的模板進行事務(wù)管理TransactionTemplate的使用標準用法沒返回值用法異常處理案例

事務(wù)的基本概念

什么是事務(wù)

是邏輯上一組操作,組成這組操作各個單元要么一起成功要么一起失敗。

事務(wù)的特性

原子性 :不可分割性一致性 :事務(wù)執(zhí)行前后,數(shù)據(jù)完整性保持一致。隔離性 :一個事務(wù)執(zhí)行的時候,不應該受到其他事務(wù)的干擾。持久性 :事務(wù)一旦結(jié)束,數(shù)據(jù)就持久化到數(shù)據(jù)庫

事務(wù)的隔離性不完善引發(fā)的問題

讀問題 臟讀 :一個事務(wù)讀到另一個事務(wù)未提交的數(shù)據(jù)。不可重復讀 :一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的update的數(shù)據(jù),導致多次查詢結(jié)果內(nèi)容不一致。幻影讀 :一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的insert、delete的數(shù)據(jù),導致多次查詢結(jié)果集合不一致。寫問題 丟失更新

設(shè)置隔離級別解決讀問題

read uncommitted :讀未提交,三個讀問題都有。read committed :讀已提交,解決臟讀,但是不可重復讀和幻影讀有可能發(fā)生。repeatable read :可重復讀,解決臟讀和不可重復讀,但是幻影讀有可能發(fā)生。serializable :可串行化,解決所有讀問題。

Spring的事務(wù)管理

在Spring中,由事務(wù)定義類TransactionDefinition完成事務(wù)信息的定義,由事務(wù)管理器PlatformTransactionManager根據(jù)事務(wù)定義信息進行事務(wù)的管理,在管理過程中生成事務(wù)的各種狀態(tài),將狀態(tài)記錄到事務(wù)狀態(tài)對象TransactionStatus中。

Spring事務(wù)管理的API

這里寫圖片描述

PlatformTransactionManager :平臺事務(wù)管理器,真正進行事務(wù)管理的對象。 DataSourceTransactionManager :底層使用JDBC的模板HibernateTransactionManager :底層使用HibernateJpaTransactionManager

平臺事務(wù)管理器接口有三個方法:

方法名 方法定義 注釋
commit void commit(TransactionStatus status) 根據(jù)事務(wù)狀態(tài)提交事務(wù)
rollback void rollback(TransactionStatus status) 根據(jù)事務(wù)狀態(tài)回滾事務(wù)
getTransaction TransactionStatus getTransaction(TransactionDefinition definition) 通過事務(wù)定義獲取事務(wù)狀態(tài)

TransactionDefinition :事務(wù)的定義信息

定義事務(wù)隔離級別 ISOLATION_DEFAULT :根據(jù)數(shù)據(jù)庫默認隔離級別設(shè)置數(shù)據(jù)庫隔離級別。(默認)ISOLATION_READ_UNCOMMITTED :讀未提交ISOLATION_READ_COMMITTED :讀已提交ISOLATION_REPEATABLE_READ :可重復讀ISOLATION_SERIALIZABLE :可串行化定義事務(wù)傳播行為 PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTED

定義事務(wù)超時信息

TIMEOUT_DEFAULT:使用事務(wù)默認超時時間。

通過以下方法可以獲取事務(wù)定義信息

getIsolationLevel():獲取事務(wù)隔離級別getName():獲取事務(wù)名稱getPropagationBehavior():獲取事務(wù)傳播行為getTimeout():獲取事務(wù)超時時間isReadOnly():事務(wù)是否只讀

TransactionStatus :事務(wù)的狀態(tài)

isNewTransaction():是否是新事務(wù)hasSavepoint():事務(wù)是否有保存點isCompleted():事務(wù)是否已經(jīng)完成isRollbackOnly():事務(wù)是否是只能回滾setRollbackOnly():設(shè)置事務(wù)為只能回滾

Spring的事務(wù)傳播行為

事務(wù)的傳播行為主要解決在復雜業(yè)務(wù)下的事務(wù)嵌套問題,比如說業(yè)務(wù)層之樂方法的相互調(diào)用。

spring事務(wù)的傳播行為

事務(wù)傳播行為取值

使用當前事務(wù)

PROPAGATION_REQUIRED默認值。如果A中有事務(wù),使用A中的事務(wù)。如果A中沒有事務(wù),創(chuàng)建一個新的事務(wù)將A的內(nèi)容包含進來。PROPAGATION_SUPPORTS :如果A中有事務(wù),使用A中的事務(wù),如果A中沒有事務(wù),不使用事務(wù)。PROPAGATION_MANDATORY :如果A中有事務(wù),使用A中的事務(wù),如果A中沒有事務(wù),拋異常。

不使用當前事務(wù)

PROPAGATION_REQUIRES_NEW如果A中有事務(wù),將A中的掛起,創(chuàng)建一個新的事務(wù)執(zhí)行自身部分。如果A中沒有事務(wù),創(chuàng)建一個新事務(wù),執(zhí)行自身部分。PROPAGATION_NOT_SUPPORTED :如果A中有事務(wù),將A中事務(wù)掛起。以非事務(wù)的方式運行。PROPAGATION_NEVER :如果A中有事務(wù),就拋異常。

使用嵌套事務(wù)

PROPAGATION_NESTED當A執(zhí)行結(jié)束后,會設(shè)置一個保存點。如果B的部分沒有錯誤,執(zhí)行通過,如果B的部分出錯,允許回滾到最初始也可以回滾到保存點。

Spring的事務(wù)管理案例環(huán)境搭建

Spring的事務(wù)管理的分類

編程式事務(wù)管理:手動編寫代碼完成事務(wù)管理聲明式事務(wù)管理:通過配置方式完成事務(wù)管理 XML方式注解方式

創(chuàng)建相關(guān)接口和類并配置注解

package com.pc.service;/** * 賬號服務(wù)接口 * * @author Switch * @data 2016年11月25日 * @version V1.0 */public interface AccountService { /** * 轉(zhuǎn)賬 * @param from 轉(zhuǎn)賬者 * @param to 收賬者 * @param money 錢數(shù) */ public void transfer(String from, String to, Double money);}package com.pc.service.impl;import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.pc.dao.AccountDao;import com.pc.service.AccountService;/** * 賬號服務(wù)接口實現(xiàn)類 * @author Switch * @data 2016年11月25日 * @version V1.0 */// 配置服務(wù)層注解@Service("accountService")public class AccountServiceImpl implements AccountService { /** * 注入賬號持久層對象依賴 */ @Resource(name = "accountDao") private AccountDao accountDao; @Override public void transfer(String from, String to, Double money) { accountDao.transferFrom(from, money); // int i = 1 / 0; accountDao.transferTo(to, money); }}package com.pc.dao;/** * 賬號持久層接口 * * @author Switch * @data 2016年11月25日 * @version V1.0 */public interface AccountDao { /** * 從哪個賬戶轉(zhuǎn)賬 * @param from 轉(zhuǎn)賬者 * @param money 錢數(shù) */ void transferFrom(String from, Double money); /** * 轉(zhuǎn)賬到哪個賬戶 * @param to 收賬者 * @param money 錢數(shù) */ void transferTo(String to, Double money);}package com.pc.dao.impl;import org.springframework.jdbc.core.support.JdbcDaoSupport;import com.pc.dao.AccountDao;/** * 賬號持久層接口實行類 * * @author Switch * @data 2016年11月25日 * @version V1.0 */// 配置持久層組件注解public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { @Override public void transferFrom(String from, Double money) { } @Override public void transferTo(String to, Double money) { }}

配置Spring

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 配置組件掃描 --> <context:component-scan base-package="com.pc.service.impl"/> <!-- 配置賬號dao,并注入數(shù)據(jù)源 --> <bean id="accountDao" class="com.pc.dao.impl.AccountDaoImpl"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- spring配置c3p0連接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="passWord" value="${jdbc.password}" /> </bean> <!-- 引入外部屬性文件 --> <context:property-placeholder location="classpath:db.properties"/></beans>

在DAO中使用JDBC的模板

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { @Override public void transferFrom(String from, Double money) { super.getJdbcTemplate().update("update account set money = money - ? where name = ?", money, from); } @Override public void transferTo(String to, Double money) { super.getJdbcTemplate().update("update account set money = money + ? where name = ?", money, to); }}

編寫測試類

package com.pc.test;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.pc.service.AccountService;/** * 測試事務(wù) * * @author Switch * @data 2016年11月25日 * @version V1.0 */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class TestTX { @Resource(name = "accountService") AccountService accountService; @Test public void test1() { accountService.transfer("Switch", "Kity", 1000d); }}

Spring的聲明式事務(wù)管理

聲明式的事務(wù)底層都是基于AOP的。

一般開發(fā)種常用的是XML方式的聲明式事務(wù),但有時候為了簡單也會使用注解方式的事務(wù)。

引入jar包 這里寫圖片描述

XML方式的聲明式事務(wù)

配置事務(wù)管理器

<!-- 配置事務(wù)管理器 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean>

配置一個事務(wù)通知

<!-- 基于XML的事務(wù)配置 --><!-- 配置事務(wù)通知 --><tx:advice id="txAdvice"> <tx:attributes> <!-- 配置事務(wù)定義 --> <tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED"/> </tx:attributes></tx:advice>

配置AOP

<!-- 事務(wù)aop配置 --><aop:config> <aop:pointcut expression="execution(* com.pc.service.impl.AccountServiceImpl.transfer(..))" id="pointcut1"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/></aop:config>

tx:method的配置

name:配置的方法名稱,支持*通配符匹配propagation:事務(wù)傳播行為isolation:事務(wù)隔離級別timeout:超時時間read-only:是否只讀事務(wù)rollback-for:觸發(fā)回滾的異常,逗號分隔no-rollback-for:不觸發(fā)回滾的異常,逗號分隔

注解方式的聲明式事務(wù)

配置事務(wù)管理器

<!-- 配置事務(wù)管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean>

開啟注解事務(wù)

<!-- 開啟注解事務(wù) --><tx:annotation-driven transaction-manager="transactionManager"/>

在業(yè)務(wù)層添加一個事務(wù)的注解

@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)public class AccountServiceImpl implements AccountService { ......}

PS:事務(wù)的注解加在類上表示該類所有方法都被事務(wù)管理器管理,加在方法上,則只有該方法被事務(wù)管理器管理。

@Transactional的配置

value:使用的TransactionManagerpropagation:事務(wù)傳播行為isolation:事務(wù)隔離級別timeout:超時readOnly:是否只讀事務(wù)rollbackFor:觸發(fā)回滾的異常類對象數(shù)組rollbackForClassName:出發(fā)回滾的異常類名稱數(shù)組noRollbackFor:不觸發(fā)回滾的異常類對象數(shù)組noRollbackForClassName:不觸發(fā)回滾的異常類名稱數(shù)組

Spring的編程式事務(wù)管理

編程式事務(wù)基本不用,這里只是基本介紹

配置事務(wù)管理器

<!-- 配置事務(wù)管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /></bean>

配置事務(wù)管理的模板(簡化事務(wù)開發(fā))

<!-- 配置事務(wù)管理模板 --><bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/></bean>

在業(yè)務(wù)層注入事務(wù)管理的模板

@Resource(name = "transactionTemplate")private TransactionTemplate transactionTemplate;

進行事務(wù)管理

package com.pc.service.impl;import javax.annotation.Resource;import org.springframework.stereotype.Service;import org.springframework.transaction.TransactionStatus;import org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import org.springframework.transaction.support.TransactionCallbackWithoutResult;import org.springframework.transaction.support.TransactionTemplate;import com.pc.dao.AccountDao;import com.pc.service.AccountService;/** * 賬號服務(wù)接口實現(xiàn)類 * @author Switch * @data 2016年11月25日 * @version V1.0 */// 配置服務(wù)層注解@Service("accountService")// @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)public class AccountServiceImpl implements AccountService { /** * 注入賬號持久層對象依賴 */ @Resource(name = "accountDao") private AccountDao accountDao; @Resource(name = "transactionTemplate") private TransactionTemplate transactionTemplate; @Override public void transfer(final String from, final String to, final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus arg0) { accountDao.transferFrom(from, money); int i = 1 / 0; accountDao.transferTo(to, money); } }); }}

TransactionTemplate的使用

標準用法

public Object transfer(final String from, final String to, final Double money) { return transactionTemplate.execute(new TransactionCallback() { @Override public Object doInTransaction(TransactionStatus arg0) { accountDao.transferFrom(from, money); int i = 1 / 0; accountDao.transferTo(to, money); return accountDao.toString(); } });}

沒返回值用法

@Overridepublic void transfer(final String from, final String to, final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus arg0) { accountDao.transferFrom(from, money); // int i = 1 / 0; accountDao.transferTo(to, money); } });}

異常處理

public void transfer(final String from, final String to, final Double money) { transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus arg0) { try { accountDao.transferFrom(from, money); // int i = 1 / 0; accountDao.transferTo(to, money); } catch (Exception e) { e.printStackTrace(); } } });}

案例

GitHub:SpringDataTest GitHub:MyStore-netease


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 互助| 康平县| 柳林县| 法库县| 鄄城县| 礼泉县| 威海市| 绥中县| 武鸣县| 凌云县| 山丹县| 调兵山市| 仁化县| 高台县| 凤凰县| 扶余县| 昂仁县| 布拖县| 灵川县| 郧西县| 敦化市| 湖口县| 贵德县| 紫云| 荣成市| 商城县| 喀什市| 淮北市| 谷城县| 连南| 维西| 桑植县| 汝南县| 沈阳市| 罗平县| 富裕县| 高州市| 定安县| 奇台县| 新疆| 织金县|