首页 > 其他分享 >Spring事务(一)-事务配置

Spring事务(一)-事务配置

时间:2022-10-04 06:15:28浏览次数:44  
标签:事务 方式 Spring 配置 操作 声明

  事务是数据库操作最基本的单元,是逻辑上的一组操作,这一组操作在同一个会话中要么都执行成功,要么都失败,这也是事务的最基本特性--原子性。事务的作用是为了保证系统数据的正确性,因此,数据库应用程序中是会经常用到事务。下面就说一下在Spring里怎么做事务操作。

Spring事务使用方式

Spring事务使用方式分两类,分别是编程式事务、声明式事务。

编程式事务

  使用编程式事务,事务操作的代码跟业务逻辑代码耦合度高,这样会造成代码的维护成本较大。因此,除非需要细粒度的控制各个事务的边界,否则一般不会用到这种方式。

声明式事务

  声明式事务控制粒度就比较粗糙,但使用这种方式可以做到全局配置,能实现与业务逻辑代码解耦,代码的维护成本较小。这也是经常用到的一种方式。声明式事务的实现完全依赖于Spring的AOP机制,其本质就是通过AOP在目标方法执行之前加入事务,在目标方法执行之后根据方法执行结果选择是执行回滚操作还是执行提交操作。

声明式事务配置的5种方式

  这里主要说一下声明式事务的配置方式。Spring事务配置总是由三个部分组成:分别是DataSource、TransactionManager和代理机制这三部分。无论哪种配置方式,一般变化的只是代理机制这部分。DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用Hibernate进行数据访问 时,DataSource实际为SessionFactory,TransactionManager的实现为 HibernateTransactionManager。

  根据代理机制的不同,总结了五种Spring事务的配置方式,配置文件如下:

第一种方式:每个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="goodsDaoTarget" class="com.lab.spring.dao.GoodsDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="goodsDao"   
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <!-- 配置事务管理器 -->
        <property name="transactionManager" ref="transactionManager" />
        <property name="target" ref="goodsDaoTarget" />
        <property name="proxyInterfaces" value="com.lab.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="goodsDaoTarget" class="com.lab.spring.dao.GoodsDaoImpl">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="goodsDao" parent="transactionBase" >
        <property name="target" ref="goodsDaoTarget" />
    </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="goodsDao" class="com.lab.spring.dao.GoodsDaoImpl">
        <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.lab" />
    <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.lab.spring.dao.*.*(..))" />
        <aop:advisor advice-ref="txAdvice"  
            pointcut-ref="interceptorPointCuts" />
    </aop:config>
</beans> 

第五种方式:@Transactional注解

<?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.lab" />
    <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注解,

@Transactional  
@Component("goodsDao")  
public class GoodsDaoImpl extends HibernateDaoSupport implements GoodsDao {  
  
    public List<Goods> goodsList() {  
        return this.getSession().createQuery("from Goods").list();  
    }      
}

标签:事务,方式,Spring,配置,操作,声明
From: https://www.cnblogs.com/ayic/p/16751967.html

相关文章

  • Django3.2前后端分离(配置)
    创建工程项目1.初始化项目步骤一:安装Django框架,安装前应确保Django的版本为LTS版,关于版本的描述见Django版本文档pipinstalldjango==3.2步骤二:创建django项目,通过d......
  • GOPATH的配置(WIN)
    配置GOPATH环境变量project文件夹在project文件夹新建3个文件夹src存放go语言源码pkg存放编译好的包对象文件bin存放链接好的可执行文件新建项目在src文件夹......
  • jemter-plugins-maven dependency -WIiki用法配置介绍
    1、先介绍下jmeter的maven中央仓库地址,有兴趣自己看下​​https://mvnrepository.com/artifact/org.apache.jmeter​​2.Wikigithub项目介绍:项目地址:​​https://github.c......
  • Feign的简单介绍及配置参数
    contextId用于区分实例,类似beanName作者:DATA_MONK​,转载请注明原文链接......
  • 定时任务quartz与spring的集成
     我想要在spring的集成框架中使用spring,暂时采用quartz 根据下面的几篇博客实现了(懒得说了,直接丢链接):Quartz实现动态定时任务​​Spring3整合Quartz2实现定时任务二:......
  • spring
    依赖查找:BeanFactorybeanFactory=newClassPathXmlApplicationContext("basic_di/inject-set.xml");Personperson=beanFactory.getBean(Person.class);根据ty......
  • 【Spring boot】自动配置的开启原理
    本文结论源码使用springboot2.6.6版本开始自动配置的核心注解:@EnableAutoConfiguration@EnableAutoConfiguration中使用了@Import(AutoConfigurationImportSelector.c......
  • python爬虫配置随机请求头headers伪装User-Agent
    python爬虫随机headers伪装fake_useragentfake_useragent库调用方法ua.random可以随机返回一个headers(User-Agent)fromfake_useragentimportUserAgent#下载:pipins......
  • Spring Cloud入门
    简介微服务是由springboot开发的一个个的模块,是一个个独立的进程springcloud是微服务全家桶springcloud通过网关调用多个负载均衡(微服务)springboot是以数字作为版本,spring......
  • 2022-10-03-SpringMVC执行流程梳理及结合源码断点调试过程源码分析
    SpringMVC执行流程梳理接口方式控制器实现流程分析控制器层代码实现控制器配置SpringMVC.xml配置文件客户端浏览器发起请求,按回车前端控制器拦截所有请求/......