`
pouyang
  • 浏览: 321599 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring 事务管理-1

阅读更多

1--用四个词解释事务:

ACID(Atomic,Consistent,Isolated,Durale)
事务内存没有Durable属性


2--首先从JDBC开始

JDBC默认情况下:JDBC负责连接,DB负责事务,这时执行一条语句,启一个事务,提交一个事务。 JDBC如果setCommit(false):则由JDBC来控制事务的启动,提交和回滚.当然了还得看某些数据库配置了,有的数据库配置可以不支持事务等等。


所以不管是程序也好,容器也好,要想控制事务,首先必须从DB的手中把事务的控制权给抢过来,然后由程序员这些控制狂们去控制事务的启动,提交和回滚。所以有些配置文件就要怎么配置了,就看自己了。




3--持久层框架出现

由于用JDBC,自己要创建连接,自己控制事务,许多的代码都重复了,在网上搜了些资料关于JDBC的缺点.
   1、内存消耗:采用JDBC的无疑是最省内存的,Hibernate的次之
   2、运行效率:如果JDBC的代码写的非常优化,那么JDBC架构运行效率最高,但是实际项目中,这一点几乎做不到,这需要程序员非常精通JDBC,运用Batch语句,调整PreapredStatement的Batch Size和Fetch Size等参数,以及在必要的情况下采用结果集cache等等。而一般情况下程序员是做不到这一点的。因此Hibernate架构表现出最快的运行效率。
  3、开发效率:在大的项目,特别是持久层关系映射很复杂的情况下,Hibernate效率高的惊人,JDBC次之
  我一个同学说,框架用得好的话性能也差不了多少,好维护,开发快
  ......总之,随潮流项目都搬上了框架.


4--Spring事务的出现

持久层框架屏蔽了连接操作,实现了O/R mapping直接操作对象等等许多优良的东西,但,偏偏有个但,不然的话spring事务也不会出现,这个但就是这些持久层框架也要控制事务,对一个系统来说,事务是相当的重要的,对事务的控制难度也比较大,而且往往没处理到位的话,会发生一些严重的后果,数据丢失等等,要知道,数据就是钱啊,不是儿戏.为了开发方便,快捷而且又有一定的安全性,Spring替程序员接管了事务,程序员更注重于业务的实现了.
下面就开始步入Spring事务的天堂.


5--Spring事务管理
 
  由于网上资料丰富在这里摘了一些,也加入了一些自己的东西
[url] http://www.blogjava.net/robbie/archive/2009/04/05/264003.html[/url]
总结如下:
   Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
  

   DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

具体如下图:
http://dl.iteye.com/upload/picture/pic/51423/38909f93-082f-3d16-a254-cf4e1731b7a5.jpg


  第一种方式:每个Bean都有一个代理

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    <bean id="sessionFactory"  
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />  
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    </bean>  

    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <!-- 配置DAO -->
    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <bean id="userDao"  
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
           <!-- 配置事务管理器 -->  
           <property name="transactionManager" ref="transactionManager" />     
        <property name="target" ref="userDaoTarget" />  
         <property name="proxyInterfaces" value="com.bluesky.spring.dao.GeneratorDao" />
        <!-- 配置事务属性 -->  
        <property name="transactionAttributes">  
            <props>  
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>  
        </property>  
    </bean>  
</beans>



第二种方式:所有Bean共享一个代理基类
<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    <bean id="sessionFactory"  
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />  
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    </bean>  

    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <bean id="transactionBase"  
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"  
            lazy-init="true" abstract="true">  
        <!-- 配置事务管理器 -->  
        <property name="transactionManager" ref="transactionManager" />  
        <!-- 配置事务属性 -->  
        <property name="transactionAttributes">  
            <props>  
                <prop key="*">PROPAGATION_REQUIRED</prop>  
            </props>  
        </property>  
    </bean>    
   
    <!-- 配置DAO -->
    <bean id="userDaoTarget" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
    <bean id="userDao" parent="transactionBase" >  
        <property name="target" ref="userDaoTarget" />   
    </bean>
</beans>




第三种方式:使用拦截器

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

    <bean id="sessionFactory"  
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />  
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    </bean>  

    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean> 
   
    <bean id="transactionInterceptor"  
        class="org.springframework.transaction.interceptor.TransactionInterceptor">  
        <property name="transactionManager" ref="transactionManager" />  
        <!-- 配置事务属性 -->  
        <property name="transactionAttributes">  
            <props>  
                <prop key="*">PROPAGATION_REQUIRED</prop>  
            </props>  
        </property>  
    </bean>
      
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
        <property name="beanNames">  
            <list>  
                <value>*Dao</value>
            </list>  
        </property>  
        <property name="interceptorNames">  
            <list>  
                <value>transactionInterceptor</value>  
            </list>  
        </property>  
    </bean>  
  
    <!-- 配置DAO -->
    <bean id="userDao" class="com.bluesky.spring.dao.UserDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>



第四种方式:使用tx标签配置的拦截器


<?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-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.bluesky" />

    <bean id="sessionFactory"  
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />  
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    </bean>  

    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:pointcut id="interceptorPointCuts"
            expression="execution(* com.bluesky.spring.dao.*.*(..))" />
        <aop:advisor advice-ref="txAdvice"
            pointcut-ref="interceptorPointCuts" />        
    </aop:config>      
</beans>



第五种方式:全注解


<?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-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <context:annotation-config />
    <context:component-scan base-package="com.bluesky" />

    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean id="sessionFactory"  
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
        <property name="configLocation" value="classpath:hibernate.cfg.xml" />  
        <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    </bean>  

    <!-- 定义事务管理器(声明式的事务) -->  
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    
</beans>
此时在DAO上需加上@Transactional注解,如下:

package com.bluesky.spring.dao;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;

import com.bluesky.spring.domain.User;

@Transactional
@Component("userDao")
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

    public List<User> listUsers() {
        return this.getSession().createQuery("from User").list();
    }
    
    
}



第六种方式
声明式事务,声明到方法的级别
<!--数据源事务管理-->
<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
	</bean>

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" isolation="SERIALIZABLE" />
			<tx:method name="modify*" propagation="REQUIRED" isolation="SERIALIZABLE" />
			<tx:method name="del*" propagation="REQUIRED" isolation="SERIALIZABLE" />
			<tx:method name="query*" propagation="SUPPORTS" isolation="READ_COMMITTED" />
		</tx:attributes>
	</tx:advice>
	
	 <aop:config>
        <aop:pointcut id="somePoint" expression="execution(* com.pouyang.service.impl.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="somePoint" />
    </aop:config>






分享到:
评论

相关推荐

    Spring框架(spring-framework-5.2.6.RELEASE)的jar包

    - `spring-tx-5.2.6.RELEASE.jar`:事务管理服务,支持编程式和声明式事务处理。 - `spring-web-5.2.6.RELEASE.jar` 和 `spring-webmvc-5.2.6.RELEASE.jar`:Web相关的模块,分别对应基础Web支持和MVC框架。 每个...

    spring-cglib-repack-3.2.5.jar,spring-objenesis-repack-2.6.jar

    在Spring中,当一个类没有实现接口时,Spring会使用CGLIB来创建代理对象,以便在不修改原有代码的情况下,为对象添加额外的功能,如事务管理、性能监控等。CGLIB的repack版本是对原始CGLIB库的重新打包,目的是为了...

    spring-tx-5.0.0.0.RELEASE.jar_java开发_spring-tx-5.0.0_

    《深入解析Spring TX 5.0.0:构建高效事务管理》 在Java开发领域,Spring框架以其强大的功能和灵活性而备受青睐。其中,Spring TX模块是Spring框架的重要组成部分,专注于提供事务管理服务。本文将深入探讨Spring ...

    spring-context-3.2.0 spring-core-3.2.0 等齐全的Spring jar包

    10. **spring-tx-3.2.0.RELEASE.jar**:事务管理模块提供了编程和声明式的事务管理,支持JTA(Java Transaction API)和本地事务。这使得在Spring应用中管理事务变得容易。 这组Spring 3.2.0库的完整集合,为开发者...

    spring导入eclipse时少的spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar

    通过这种方式,Spring能够注入切面逻辑,比如日志记录、事务管理等,即使在不修改原有代码的情况下也能实现扩展功能。 其次,`spring-objenesis-repack-2.4.jar`是Objenesis库的一个版本,Objenesis是一个用于创建...

    spring-aop-jar

    Spring AOP模块提供了实现AOP规范的功能,它允许开发者定义“切面”来封装系统中的横切关注点,如日志、事务管理等。该jar文件包含了Spring AOP的核心类和接口,如`org.springframework.aop.*`包下的`...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2docs

    在事务管理方面,Spring 2.5进一步完善了声明式事务管理,允许开发者通过注解或XML配置来定义事务边界,减少了手动处理事务的复杂性。此外,对JDBC、Hibernate、JPA等多种持久层技术的集成,使Spring成为了数据库...

    Spring事务管理Demo

    Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...

    Spring事务处理-ThreadLocal的使用

    首先,了解Spring事务管理的基本概念。在多线程环境中,事务管理是至关重要的,它负责确保一组数据库操作要么全部成功,要么全部失败。Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。声明式...

    spring-framework-1.0-with-dependencies.zip

    5. **spring-tx**:支持声明式事务管理,使得事务管理可以在不修改业务代码的情况下进行。 6. **spring-web**和**spring-webmvc**:这两个模块是Spring与Web应用的接口,前者提供HTTP Servlet的集成,后者则是...

    struts2-spring-plugin-2.2.1.jar

    3. **Spring事务管理**:插件允许Struts2的Action方法直接参与到Spring的事务管理中,无需关心事务的开启和提交。 4. **AOP集成**:结合Spring的AOP能力,可以为Struts2的Action提供切面增强,如性能监控、日志记录...

    spring4源码所需要的spring-objenesis-repack-2.1.jar,spring-cglib-repack-3.1.jar

    5. **AOP(面向切面编程)**: AOP是Spring框架的重要特性之一,允许开发者将关注点分离,如日志记录、事务管理等,从业务逻辑中解耦。Objenesis和CGLIB在这里起到了代理生成的作用,使得切面能够在不修改目标类的...

    官方原版spring-framework-4.3.18.RELEASE.zip

    通过阅读文档,开发者可以深入了解Spring MVC、数据访问、事务管理、测试等模块的使用方法。 "spring-framework-4.3.18.RELEASE-schema.zip"文件提供了Spring配置文件所使用的XML架构定义。这些架构文件定义了...

    spring-modules-0.9.zip

    在0.9版本中,Spring Modules可能已经包含了对Spring核心的扩展,比如AOP(面向切面编程)的增强,提供了一些预定义的切面,便于处理常见的企业级问题,如日志记录、事务管理等。同时,它可能还提供了对Spring IoC...

    spring-framework-4.3.5 所有JAR文件包

    1. **Spring Core**: - Spring的核心组件,提供了依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)功能。DI是Spring的核心特性,它允许对象之间的关系在运行时动态地配置...

    spring-data-redis 1.7.6

    4. **事务支持**:Spring Data Redis允许开发者使用`RedisTransactionManager`来管理Redis的事务,提供了与传统关系型数据库相似的事务操作能力,如BEGIN、COMMIT、ROLLBACK等。 5. **持久化策略**:Spring Data ...

    spring-data-commons-1.7.2.RELEASEspring-data-jpa-1.5.2.RELEASE-java datajpa

    1. **JPA 整合**:Spring Data JPA 提供了与 JPA 规范的无缝集成,包括实体管理、事务管理和数据源配置。 2. **EntityManager 和 Repository**:Spring Data JPA 封装了 `EntityManager` 和 `EntityTransaction`,...

    spring-framework-3.2.0.RELEASE-dependencies框架依赖包

    5. **事务管理**:Spring 提供了统一的事务管理接口,可以管理数据库事务以及基于JMS的消息事务。3.2.0版本提供了更灵活的编程和声明式事务管理策略。 6. **消息支持**:Spring 对Java消息服务(JMS)提供全面支持...

    spring-framework-4.3.8.RELEASE官方完整包加官方文档

    5. **声明式事务管理**:Spring的事务管理使得开发者可以声明性地控制事务边界,无需编写复杂的事务管理代码。 6. **Spring Boot**:虽然Spring Boot不是4.3.8.RELEASE的一部分,但在这个版本中,Spring Boot的兼容...

    spring-jdbc-4.2.4.RELEASE.jar,spring-tx-4.2.4.RELEASE.jar,jdbcTemplate使用的jar包

    Spring JDBC和Spring TX是Spring框架中的两个重要模块,它们在Java企业级开发中扮演着核心角色,特别是对于数据库操作和事务管理。`jdbcTemplate`是Spring JDBC模块的一部分,提供了简化数据库访问的API,使得开发者...

Global site tag (gtag.js) - Google Analytics