Spring事务管理2--声明式
简述
1、Spring 的声明式事务管理在底层是建立在 AOP 的基础上。其本质是在方法前后进行拦截,然后在目标方法开始之前创建一个事务,在执行这目标方法结束后,根据执行情况提交或进行回滚事务。
2、声明式事务最大的优点就是不需通过编程的方式而进行管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明,便可将事务规则应用到业务逻辑中。
3、声明式事务不足的地方在于,与编程式事务相比,只能作用到方法级别,无法像编程式事务那样可以作用到代码块级别。
XML方式
<!-- 配置事务管理器================= -->
<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="save*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/> -->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice> <!-- aop的配置=================== -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* zcc.spring_tx.demo2.accountServiceImp1.*(..))" id="pointcut1"/>
<!-- 配置切入面,以前刚学面向切面编程的时候需要手动编写一个切面类,但是事务spring支持了,不需要自己手动编写-->
<!-- <aop:aspect ref="">
<aop:before method=""/>
</aop:aspect> -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>
注解方式
<!-- 配置事务管理器================= -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 开启注解事务================= -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在业务层上添加注解,注解里面也可以添加属性,比如
@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)

详细代码如下:
tx2.xml
<?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"> <!-- 配置Service================ -->
<bean id="accountService"
class="zcc.spring_tx.demo2.accountServiceImp1">
<property name="dao" ref="accountDao"></property>
</bean> <!-- 配置Dao===================== -->
<bean id="accountDao" class="zcc.spring_tx.demo2.accountDaoImp1">
<!-- <property name="jdbcTemplate" ref="jdbcTemplate"></property> -->
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 配置连接池和jdbc模板 ===================== -->
<context:property-placeholder
location="classpath:jdbc.properties" /> <!-- 配置c3p0连接池============ -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!-- 配置jdbc模板================ -->
<!-- <bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
==属性注入==
<property name="dataSource" ref="dataSource"></property>
</bean> --> <!-- 配置事务管理器================= -->
<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="save*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="true"/> -->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice> <!-- aop的配置=================== -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* zcc.spring_tx.demo2.accountServiceImp1.*(..))" id="pointcut1"/>
<!-- 配置切入面,以前刚学aop的时候需要手动编写一个切面类,但是事务spring支持了,不需要自己手动编写-->
<!-- <aop:aspect ref="">
<aop:before method=""/>
</aop:aspect> -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>
</beans>
tx3.xml
<?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"> <!-- 配置Service================ -->
<bean id="accountService"
class="zcc.spring_tx.demo3.accountServiceImp1">
<property name="dao" ref="accountDao"></property>
</bean> <!-- 配置Dao===================== -->
<bean id="accountDao" class="zcc.spring_tx.demo3.accountDaoImp1">
<!-- <property name="jdbcTemplate" ref="jdbcTemplate"></property> -->
<property name="dataSource" ref="dataSource"></property>
</bean> <!-- 配置连接池和jdbc模板 ===================== -->
<context:property-placeholder
location="classpath:jdbc.properties" /> <!-- 配置c3p0连接池============ -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean> <!-- 配置事务管理器================= -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean> <!-- 开启注解事务=================== -->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
补充:
重点掌握声明式配置
xml的,配置事务管理器,<tx:advice>,<tx:attributes>,<tx:method>,<aop:config>,,<aop:pointcut>,<aop:advisor>
注解方式的:<tx:annotation-driven transaction-manager="transactionManager"/>,在业务层上一定要记得加事务的注解
最后,看到一篇写的很不错的关于spring事务的博客,在此附上地址,总结的很好:https://blog.csdn.net/trigl/article/details/50968079
Spring事务管理2--声明式的更多相关文章
- Spring事务管理之声明式事务管理-基于注解的方式
		
© 版权声明:本文为博主原创文章,转载请注明出处 案例 - 利用Spring的声明式事务(TransactionProxyFactoryBean)管理模拟转账过程 数据库准备 -- 创建表 CREAT ...
 - Spring事务管理之声明式事务管理-基于AspectJ的XML方式
		
© 版权声明:本文为博主原创文章,转载请注明出处 案例 - 利用Spring的声明式事务(AspectJ)管理模拟转账过程 数据库准备 -- 创建表 CREATE TABLE `account`( ` ...
 - Spring事务管理之声明式事务管理:基于TransactionProxyFactoryBean的方式
		
© 版权声明:本文为博主原创文章,转载请注明出处 案例 - 利用Spring的声明式事务(TransactionProxyFactoryBean)管理模拟转账过程 数据库准备 -- 创建表 CREAT ...
 - 全面分析 Spring 的编程式事务管理及声明式事务管理
		
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
 - 全面分析 Spring 的编程式事务管理及声明式事务管理--转
		
开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...
 - Spring编程式事务管理及声明式事务管理
		
本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...
 - spring事务配置,声明式事务管理和基于@Transactional注解的使用(转载)
		
原文地址:http://blog.csdn.net/bao19901210/article/details/41724355 事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的 ...
 - spring笔记--事务管理之声明式事务
		
事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使 ...
 - Spring框架的事务管理之声明式事务管理的类型
		
1. 声明式事务管理又分成两种方式 * 基于AspectJ的XML方式(重点掌握)(具体内容见“https://www.cnblogs.com/wyhluckdog/p/10137712.html”) ...
 - 转:全面分析 Spring 的编程式事务管理及声明式事务管理
		
转:from: https://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/
 
随机推荐
- c# 大批量用户访问数据库报错
			
报错信息:There is already an open DataReader associated with this Connection which must be closed first ...
 - C# 操作注册表WindowsRegistry
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsof ...
 - PHP程序员解决问题的能力
			
这个话题老生长谈了,在面试中必然考核的能力中,我个人认为解决问题能力是排第一位的,比学习能力优先级更高.解决问题的能力既能看出程序员的思维能力,应变能力,探索能力等,又可以看出他的经验.如果解决问题能 ...
 - Laravel日志
			
大家在使用 Log::info() 会让日志全部记录默认在 storage/logs/laravel.log 文件里,文件大了查找起来就比较麻烦.那么我可不可以单独记录在一个日志文件里呢? 只需在你的 ...
 - Java基础IO流(三)字符流
			
字符流: 文本和文本文件: java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码)文件是byte byte byte....的数据序列,而文本文件是文本(char)序列 ...
 - Hibernate(十三)迫切内连接fetch
			
迫切内连接fetch 内连接和迫切内连接的区别: 其主要区别就在于封装数据,因为他们查询的结果集都是一样的,生成底层的SQL语句也是一样的. 1.内连接:发送就是内连接的语句,封装的时候将属于各自对象 ...
 - 四、HTTP控制器
			
1.控制器的作用:数据和视图之间的桥梁 2.控制器创建方法: (1)手动创建 <?php namespace App\Http\Controllers; class UserController ...
 - phpcms配置列表页以及获得文章发布时间
			
<div class="moocConDetail"> {pc:content action="lists" catid="11" ...
 - python 标准类库-数据类型之集合-容器数据类型
			
标准类库-数据类型之集合-容器数据类型 by:授客 QQ:1033553122 Counter对象 例子 >>> from collections import Counter ...
 - Android为TV端助力 关于线程的那些事
			
今天发现之前自己一直有个误区,new Runnable(run()方法){}原来它不是一定创建一个线程 如果用主线程的handler去post(Runnable),他就不会创建子线程,而是在主线程上执 ...