美文网首页
Spring中的事务

Spring中的事务

作者: 我是邱邱 | 来源:发表于2018-09-09 17:46 被阅读0次

概念

事务是一组操作的执行单元,针对数据库操作,事务管理的是一组SQL指令,事务内的操作要不全部成功,要不全部失败。比如执行过程中,如果有一条SQL语句没有执行成功,那么这一组操作都将全部回滚

事务特性(ACID):

Atomic(原子性):要么都成功,要么都失败
Consistent(一致性):数据不应该被破坏
Isolate(隔离性):用户间操作不相混淆
Durable(持久性):永久保存

事务分类:

编程式事务

编写程序式的事务管理可以清楚的定义事务的边界,可以实现细粒度的事务控制,比如你可以通过程序代码来控制你的事务何时开始,何时结束等,与后面介绍的声明式事务管理相比,它可以实现细粒度的事务控制,例如jdbc、hibernate,但是spring中不提倡使用。

声明式事务

如果你并不需要细粒度的事务控制,你可以使用声明式事务,在Spring中,你只需要在Spring配置文件中做一些配置,即可将操作纳入到事务管理中,解除了和代码的耦合, 这是对应用代码影响最小的选择,这一点再次验证了Spring关于AOP的概念。当你不需要事务管理的时候,可以直接从Spring配置文件中移除该设置

Spring使用声明式事务,结合AOP一起使用
Spring中的事务针对方法,一般将事务用在service层

声明式事务的配置:
以下是采用JdbcTemplate方式连接的数据库的事务的配置以及数据库的连接

<context:component-scan base-package="com.qianfeng.xmltx"></context:component-scan>
        
        
     <!--  数据源对象: C3P0连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/hib1804"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
        <property name="initialPoolSize" value="3"></property>
        <property name="maxPoolSize" value="10"></property>
        <property name="maxStatements" value="100"></property>
        <property name="acquireIncrement" value="2"></property>
    </bean>
        
    <!--  JdbcTemplate工具类实例 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    
    <!-- spring中事务的配置 -->
    <!-- 1配置事务管理类,不同的数据库操作方法,对应的管理类不同 -->
    <bean id="txManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入连接池的对象 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
   
   <!-- 2配置事务的增强(通知) 针对什么样的方法,采用什么样的事务处理方式
        指定事务管理类对象
    -->
   <tx:advice id="txAdvice" transaction-manager="txManage">
        <tx:attributes>
            <!-- 针对add开头的方法,事务处理时,只读属性=false、
                read-only 是否只读,如果进行增删改,必须设为false,如果是查询,设为true
                propagation 事务的传播特性
             -->
            <tx:method name="add*" read-only="false" propagation="REQUIRED"/>
            <tx:method name="delete*" read-only="false" propagation="REQUIRED"/>
            
        </tx:attributes>
   </tx:advice>
   
   <!-- 3AOP配置 -->
   <aop:config>
        <!-- 切入点 -->
        <aop:pointcut expression="execution(* com.qianfeng.xmltx.UserService.*(..))" id="pc"/>
        <!-- 针对spring中事务的配置,不需要配置切面类,spring内部根据事务操作,集成了切面类 -->
        <!-- 但是,需要告知spring,相关的方法,需要采用什么样的事务处理策略(方式) -->
        <!-- 通知 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
   
   </aop:config>
下面是采用Hibernate连接数据库的方式和Spring结合后的事务的配置:
<!-- 注解扫描  扫描指定包及其子包下的注解 -->
   <context:component-scan base-package="com.qianfeng"></context:component-scan>
  
   <!-- 数据源的配置 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/hib1804"></property>
        <property name="user" value="root"></property>
        <property name="password" value="root"></property>
        <property name="initialPoolSize" value="5"></property>
        <property name="maxPoolSize" value="10"></property>
        <property name="maxIdleTime" value="1000"></property>
    </bean>
    
    <!-- 通过Spring创建Hibernate的SessionFactory对象 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!-- 将原来hibernate.cfg.xml的配置直接写入spring的配置 -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
        <!-- 配置hibernate的映射文件 -->
        <!-- <property name="mappingLocations">
            <list>
                <value>classpath:com/qianfeng/entity/User.hbm.xml</value>
                <value>classpath:com/qianfeng/entity/Person.hbm.xml</value>
                引入所有后缀是hbm.xml的映射文件
                <value>classpath:com/qianfeng/entity/*.hbm.xml</value>
            </list>
        </property> -->
        
        <!-- 扫描hibernate注解 -->
        <property name="packagesToScan" value="com.qianfeng.entity"></property>
    </bean>
   
  <!-- 1配置hibernate的事务管理类 -->
    <bean id="txManage" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <!-- 注入sessionFactory -->
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
   
    <!-- 2配置事务的特性 -->
   <tx:advice id="txAdvice" transaction-manager="txManage">
        <tx:attributes>
            <!-- 针对使用事务的add开头的方法 
            read-only 是否只读,true 是,false 可读可写
            如果有插入等操作,设为为true,运行程序会报异常-->
            <tx:method name="add*" read-only="false"/>
            
        </tx:attributes>
   </tx:advice>
   
   <!-- 3AOP配置 -->
   <aop:config>
        <!-- 切入点 -->
        <aop:pointcut expression="execution(* com.qianfeng.service.*.*(..))" id="pc"/>
   
        <!-- 通知 -->
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
   
   </aop:config>

相关文章

  • Spring中实现事务方式

    Spring 中实现事务的方式 Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务,...

  • 深入理解Spring事务的传播行为

    本文主要介绍下Spring事务中的传播行为。 事务传播行为介绍 Spring中的7个事务传播行为: 举例说明 案例...

  • Spring事务笔记--事务传播

    Spring中事务支持的重要类:TransactionDefinition Spring支持的7种事务类型: PR...

  • Spring事务之编程式事务

    一.Spring对编程式事务的支持 Spring中的事务分为物理事务和逻辑事务;物理事务:就是底层数据库提供的事务...

  • Spring事务代理机制总结(含代码Demo)

    Spring事务代理机制总结: 1、Spring声明式事务的底层是怎么实现的? 通过Spring中的代理,那在Sp...

  • Spring-AOP事物管理

    1.概述 Spring 中的事务主要是利用 Aop 思想,简化事务的配置 2.核心接口 Spring事务管理的实现...

  • Spring 第四天笔记:Spring 中的事务控制

    1. Spring 中的事务控制 1.1 Spring 事务控制我们要明确的   第一:JavaEE 体系进行分层...

  • 关于事务的思考

    Spring对于事务的支持 Spring事务接口 Spring事务管理器 Spring并不直接管理事务,而是提供多...

  • 【Note】Spring 事务

    Spring的特色之一,简单而强大的事务管理功能,包括编程式事务和声明式事务。 1.Spring中涉及到事务管理的...

  • Spring事务

    Spring的特色之一,简单而强大的事务管理功能,包括编程式事务和声明式事务。1. Spring中涉及到事务管理的...

网友评论

      本文标题:Spring中的事务

      本文链接:https://www.haomeiwen.com/subject/flddgftx.html