知识点:

  1、事务的隔离级别和事务的传播行为

  2、配置声明式事务(XML方式和注解方式)

  3、事务不生效的情况

  

一、Spring事务配置

  在项目开发过程中经常会使用事务来确保数据的一致性。根据网上的资料整理一下在spring中配置事务的几种方式。无论是哪种方式都需要在配置文件中配置连接池和事务管理器,代码如下。

<!-- 读取配置文件 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:database.properties</value>
<value>classpath:service.properties</value>
</list>
</property>
<property name="fileEncoding" value="UTF-8" />
<property name="ignoreResourceNotFound" value="false" />
</bean>
<!--连接池 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

  1、声明式事务管理

  1.1 基于AspectJ的XML方式的配置 这是我觉得最好的方式,基于aop配置,当新增的方法要使用事务管理时,无需修改代码。首先在配置文件xml中引入aop和tx的命名空间

xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"

  1.2 然后在xml中加入aop的配置。下面的配置就是在services的切入点上应用txAdvice的增强,services的切入点就是ymy.com.service.impl包下的所有方法应用txAdvice的增强。

    然后txAdvice是在所有以create,add,delete,update,change开头的方法上加上事务管理。

<!-- 定义事务通知 (事务的增强)-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义方法的过滤规则 -->
<tx:attributes>
<!-- 所有方法都使用事务 -->
<!--
propagation:事务传播行为
isolation:事务隔离
read-only:只读
rollback-for:发生哪些异常回滚
no-rollback-for:发生哪些异常不回滚
timeout:过期信息
-->
<tx:method name="create*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="change*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 定义AOP配置 配置切面 -->
<aop:config>
<!-- 定义一个切入点 -->
<aop:pointcut id="services" expression="execution (* ymy.com.service.impl.*.*(..))" />
<!-- 对切入点和事务的通知,进行适配 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="services"/>
</aop:config>

  采用这种方式配置,当方法是按照事务定义的规则命名时,都会加入事务管理。

  2、基于注解事务管理

  这种方式是我觉得最简单的,第二推荐。要采用注解的方式,需要在配置文件中开启注解事务。在默认情况下<tx:annotation-driven/>会自动使用名为"transactionManager"的事务管理器。

所以如果用户的事务管理器id为"transactionManager",则可以进一步将①处的配置简化为<tx:annotation-driven/>

  <tx:annotation-driven/>还有另外两个属性:

    proxy-target-class: 如果为true,则Spring将通过创建子类来代理业务类;如果为false,则使用基于接口的代理。如果使用子类代理,则需要导入CGLib.jar类库。

    order: 如果业务类除事务切面外,还需要织入其他切面,则通过该属性可以控制事务切面在目标连接点的织入顺序。

<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>

  在使用时只需在对应的类上添加注解@Transactional即可

@Service
@Transactional(propagation=Propagation.REQUIRED)
) public class TaskService implements ITaskService { }

二、Spring事务详解

  1、MySQL事务知识

  2、Spring事务有7种传播行为

                              

 

  3、Spring事务的隔离级别

                              

  4、Spring事务回滚的注意点

    4.1 原理和概念:@Transaction是基于动态代理机制
    a. @Transaction应用在接口、接口方法、类、类中的public方法 上面的

    b. @Transaction只能应用在public定义的方法上面,如果使用在protected或者private的方法上面,就不会产生事务的效果
    c. 建议将@Transaction声明在类或者类中的方法上面,不要声明在接口和接口的方法上面。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效
    d. 一个类中一个A方法调用有事务的B方法,事务是不会起作用的。
    e. Spring默认的事务回滚规则为“运行期异常回滚,检查性异常不回滚”。
    这种情况不会回滚
    
    

    这两种种情况会回滚
    
    

 

Spring-事务配置和详解的更多相关文章

  1. Spring事务管理(详解+实例)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  2. (转)Spring事务管理(详解+实例)

    文章转自:http://blog.csdn.net/trigl/article/details/50968079 写这篇博客之前我首先读了<Spring in action>,之后在网上看 ...

  3. spring xml配置标签详解

    <!-- 指定类的名称 在对bean进行定义时,除了使用id属性来指定名称之外,为了提供多个名称,可以使用alias标签来指定. --> <alias name="&quo ...

  4. Spring MVC 配置Controller详解

    在SpringMVC中,对于Controller的配置方式有很多种,如下做简单总结 第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置: <!-- 表示将请求的URL ...

  5. Spring事务传播行为详解

    前言 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为.事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为.这是Spring ...

  6. Spring事务传播机制详解

    1 事务的传播属性(Propagation) 1) REQUIRED ,这个是默认的属性 Support a current transaction, create a new one if none ...

  7. spring事务配置详解

    一.前言 好几天没有在对spring进行学习了,由于这几天在赶项目,没有什么时间闲下来继续学习,导致spring核心架构详解没有继续下去,在接下来的时间里面,会继续对spring的核心架构在继续进行学 ...

  8. idea spring+springmvc+mybatis环境配置整合详解

    idea spring+springmvc+mybatis环境配置整合详解 1.配置整合前所需准备的环境: 1.1:jdk1.8 1.2:idea2017.1.5 1.3:Maven 3.5.2 2. ...

  9. Spring Data操作Redis详解

    Spring Data操作Redis详解 Redis是一种NOSQL数据库,Key-Value形式对数据进行存储,其中数据可以以内存形式存在,也可以持久化到文件系统.Spring data对Redis ...

随机推荐

  1. 【Python3之正则re】

    一.正则re 1.正则表达式定义 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Pytho ...

  2. zxing .net 多种条码格式的生成

    下载地址:http://zxingnet.codeplex.com/ zxing.net是.net平台下编解条形码和二维码的工具,使用非常方便. 本文主要说明一下多种类型条码的生成. 适用的场景,标签 ...

  3. 前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例

    使用vue-cli可以规范项目,提高开发效率,但是使用vue-cli时需要一些ECMAScript6的知识,特别是ES6中的模块管理内容,本章先介绍ES6中的基础与模块化的内容再使用vue-cli开发 ...

  4. PHP curl请求https遇到的坑

    PHP里curl对https的证书配置默认是服务器端要求验证的,如果服务器端没有配置证书验证,则无法请求https路径.如果为了简便使用不需要配置https证书的话,配置curl时将以下两项设置为fa ...

  5. Python网络编程篇之socket

    1 socket 插座?呵呵,想多了,翻译过来意思是套接字! A network socket is an internal endpoint for sending or receiving dat ...

  6. .net 下发送calendar

    前段时间公司系统中有一块需要发送邮件calendar outlook可以接受查看calendar 发送outlook主要是有rrule脚本的边界 网上找过一些资料,主要有两种实现方式 1.一种是已ic ...

  7. JavaScript(一)js简单介绍

    JavaScript JS历史简述: javascript 是 netscape 网景公司 的  布兰德·艾奇  研发的, 网景要求  布兰德·艾奇 10天开发出来一个与Java相似 但要比java简 ...

  8. 数独GUI程序项目实现

    数独GUI程序项目实现 导语:最近玩上了数独这个游戏,但是找到的几个PC端数独游戏都有点老了...我就想自己做一个数独小游戏,也是一个不错的选择. 前期我在网上简单地查看了一些数独游戏的界面,代码.好 ...

  9. Springboot(二):Spring Boot 之 HelloWorld

    关于项目的创建不再解释,需要了解的请参考: Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程 目录结构: 首先我们在上一项目的 ...

  10. clear命令新认识

    学习Linux的时候,最先学习的几个命令中有一个就是clear,中文翻译为:清屏. 以前的理解都是按照字面进行解读的,清除屏幕上多余的内容. 但是实际上真的如此么? 原来屏幕是: 运行clear命令: ...