Spring实战笔记5---事务管理

事务管理(事务管理的规则式,在提交之前,如果修改数据库的话会真是改变,但是会留一个缓存,在事务出现错误的时候,会根据事务的配置做相应的回滚操作,在回滚操作式把还从当中的数据和数据库的数据做同步,修改数据库的操作不会发生在提交的时刻,估计是为了效率考虑的)

在软件开发领域,全有或者全无的操作被称为事务

用四个词来表示事务: 原子性 一致性 隔离性 持久性(事务完成,结果将会持久话,多半会涉及到数据库操作)

理解spring对事务管理的支持

spring通过回调机制将实际的事务实现从事务性代码中分离出来,spring支持编码式事务和声明式事务,编码式事务可以惊喜的控制事务,而声明式事务只支持在方法上添加事务

主要介绍声明式事务,编码式事务类似JDBC的数据模版,需要吧实际执行的代码包含在事务模版当中。

Spring的事务管理器

声明spring的事务管理器Bean的目的是告诉spring将会启动那种方式的事务管理模型,这里只说明基础的hibernate事务管理器

如果应用程序的持久话是通过hibernate实现的话,那么你需要使用

HibernateTransactionManager

我使用的是Hibernate4所以需要在spirng的应用上下文当中声明如下的bean

<bean id="transactionManager"

class="org.springframework.orm.hibernate4.HibernateTransactionManager">

<property
name="sessionFactory"
ref="sessionFactory"></property>

</bean>

这里需要一个SessionFactory当作事务管理器的入参

声明式事务

事务的属性: 传播行为(propagation)    隔离级别(isolation)     是否只读(read-only)     事务超时(timeout)      事务回滚(rollback-for no-rollback-for)

传播行为:

1. PROPAGATION_MANDATORY  表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常。

2. PROPAGATION_NESTED  表示当前如果已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前的事务进行单独的提交或者回滚。

3. PROPAGATION_NEVER 表示当前方法不应该运行在事务上下文中,如果当前正在有一个事务运行,则会抛出异常。

4. PROPAGATION_NOT_SUPPORTED 表示该方法不应该运行在事务当中,如果存在当前事务,在该方法运行期间,当前事务将被挂起。

5. PROPAGATION_REQUIRED 表示当前方法必须运行在事务中,如果当前事务存在,方法将会在该事务中运行,否则会启动一个新的事务。

6. PROPAGATION_REQUIRED_NEW 表示当前方法必须运行在他自己的事务当中,一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。

7. PROPAGATION_SUPPORTS 表示当前方法不需要事务上下文,但是如果存在当前事务的话,那么该方法将会在这个事务中运行

隔离级别:

1. ISOLATION_DEFAULT 使用后端数据库默认的隔离级别

2. ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的数据变更。可能会导致脏读幻读或者不可重复读

3. ISOLATION_READ_COMMITTED 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或者不可重复读仍有可能发生

4. ISOLATION_REPEATABLE_READ 对同一字段的多次读取结果是一致的,除非数据是被本事务自己所修改

5. ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保阻止脏读,不可重复读和幻读

<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-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-3.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

</beans>

<tx:advice id="txAdvice">

<tx:attributes>

<tx:method
name="add*"
propagation="REQUIRED"
/>

<tx:method
name="update*"
propagation="REQUIRED"
/>

<tx:method
name="delete*"
propagation="REQUIRED"
/>

<tx:method
name="*"
propagation="SUPPORTS"
read-only="true"
/>

</tx:attributes>

</tx:advice>

同样也可以设置 isolation timeout rollback-for no-rollback-for
这些属性 但是rollback属性现在还不知道需要设置成生么样式,第一感觉应该是异常类的全称

定义事务的切点,注意AspectJ 的切点表达式中 “*” 后边要多加一个空格的

<aop:config>

<aop:pointcut id="user"

expression="execution(* com.newblog.DataResourceDao.UserDao.* (..))"
/>

<aop:pointcut id="blog"

expression="execution(* com.newblog.DataResourceDao.BlogDao.* (..))"
/>

<aop:pointcut id="comment"

expression="execution(* com.newblog.DataResourceDao.PictureDao.* (..))"
/>

<aop:pointcut id="picture"

expression="execution(* com.newblog.DataResourceDao.BlogDao.* (..))"
/>

<aop:advisor pointcut-ref="user"
advice-ref="txAdvice"
/>

<aop:advisor pointcut-ref="blog"
advice-ref="txAdvice"
/>

<aop:advisor pointcut-ref="comment"
advice-ref="txAdvice"
/>

<aop:advisor pointcut-ref="picture"
advice-ref="txAdvice"
/>

</aop:config>

时间: 2024-08-29 23:50:22

Spring实战笔记5---事务管理的相关文章

Spring Transaction + MyBatis SqlSession事务管理机制研究学习

线上的系统中,使用的是Spring+Mybatis+Mysql搭建的框架,由于客户需要,最近一直在对性能提升部分进行考虑,主要是涉及Mysql的一些重要参数的配置学习,以及Spring事务管理机制的学习,因为通过观察服务器日志,发现在这两部分的时候耗时比较严重,特别是进行mysql事务提交的时候,项目源码中使用了Spring的声明式事务,即通过@Transactional注解来控制事务的开启与提交,这两天看了一些关于Spring Transaction事务的一些文章,也debug了源码,总算有点

Spring整合hibernate4:事务管理

Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTransaction,commit,这些都是重复的工作,我们可以把事务管理部分交给spring框架完成. 配置事务(xml方式) 使用spring管理事务后在dao中不再需要调用beginTransaction和commit,也不需要调用session.close(),使用API  sessionFactory.getCurrentSession()来

[JavaEE - JPA] 3. Spring Framework中的事务管理

前文讨论了事务划分(Transaction Demarcation)在EJB中是如何实现的,本文继续介绍在Spring Framework中是如何完成事务划分的. 我们已经知道了当采用Container事务类型的时候,事务划分主要有以下两种方案(参考这里): 使用JTA接口在应用中编码完成显式划分 在容器的帮助下完成自动划分 在使用JavaEE的EJB规范时,这两种方案分别被实现为BMT以及CMT,关于BMT和CMT在上一篇文章中有比较详尽的讨论(参考这里). 那么对于Spring Framew

Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis

项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性.此处使用atomikos来实现:最后附源码: 1:spring3.0之后不再支持jtom[jta]了,第三方开源软件atomikos(http://www.atomikos.com/)来实现. 2:org.springframework.transaction.jta.JotmFactoryBean类,spring-tx-2.5.6.jar中有此类,spring-tx-3.0.

全面分析 Spring 的编程式事务管理及声明式事务管理--转

开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本教程假定您已经掌握了 Java 基础知识,并对 Spring 有一定了解.您还需要具备基本的事务管理的知识,比如:事务的定义,隔离级别的概念,等等.本文将直接使用这些概念而不做详细解释.另外,您最好掌握数据库的基础知识,虽然这不是必须. 系统需求 要试验这份教程中的工具和示例,硬件配置需求为:至少带

spring mvc + mybatis + spring aop声明式事务管理没有作用

在最近的一个项目中,采用springMVC.mybatis,发现一个很恼人的问题:事务管理不起作用!!网上查阅了大量的资料,尝试了各种解决办法,亦未能解决问题! spring版本:3.0.5 mybatis版本:3.2.2 1.applicationContext.xml配置: mvc + mybatis + spring aop声明式事务管理没有作用" title="spring mvc + mybatis + spring aop声明式事务管理没有作用">2.spr

Spring学习之Spring的声明式事务管理详解

声明式事务管理 大多数Spring用户选择声明式事务管理的原因是,这个是对应用代码影响最小的选择,因此也最符合 非侵入式 轻量级容器的理念. Spring声明式事务管理可以在任何环境下使用.只需更改配置文件, 它就可以和JDBC.JDO.Hibernate或其他的事务机制一起工作. Spring的声明式事务管理可以被应用到任何类(以及那个类的实例)上. Spring提供了声明式的回滚规则. Spring允许你通过AOP定制事务行为.(例如,如果需要,你可以在事务回滚中插入定制的行为. 你也可以增

Spring 注解方式实现 事务管理

使用步骤: 步骤一.在spring配置文件中引入<tx:>命名空间<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation

转 Spring @Transactional 声明式事务管理 getCurrentSession

Spring @Transactional声明式事务管理  getCurrentSession   在Spring @Transactional声明式事务管理的配置中,hibernate.current_session_context_class=thread- 这一句是不能加的-加了就会出错..那为什么不能加呢? 那是因为在Spring事务管理中,current Session是绑定到SpringSessionContext中的,而不是ThreadLocalSessionContext中的 先