zoukankan      html  css  js  c++  java
  • Spring中事务配置以及事务不起作用可能出现的问题

    前言:在Spring中可以通过对方法进行事务的配置,而不是像原来通过手动写代码的方式实现事务的操作,这在很大程度上减少了开发的难度,本文介绍Spring事务配置的两种方式:基于配置文件的方式和基于注解的方式。并对配置过程中可能出现的问题作出总结。


    一、基于配置文件的方式

     1     <context:component-scan base-package="com.learning"/>
     2 
     3     <!-- c3p0连接池配置--><!--注意最好是加上编码的设置,并注意在xml文件中&需要进行转义,通过&amp;进行转义-->
     4     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
     5           destroy-method="close"
     6           p:driverClass="com.mysql.jdbc.Driver"
     7           p:jdbcUrl="jdbc:mysql://localhost:3306/springlearning?useUnicode=true&amp;characterEncoding=UTF-8"
     8           p:user="root"
     9           p:password=""/>
    10 
    11     <!-- 配置jdbcTemplate模板-->
    12     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
    13           p:dataSource-ref="dataSource"/>
    14 
    15 
    16     <!-- 事务配置 3步,比较固定,注意数据库的引擎,是否支持事务-->
    17     <!--MySql默认数据引擎为MyISAM,是不支持事务,需改成InnoDB才能进行事务的操作-->
    18     <!-- 1.配置事务,开启spring的事务管理-->
    19 
    20     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    21           p:dataSource-ref="dataSource"/>
    22    
    23     <!-- 2.然后配置事务的增强-->
    24     <tx:advice id="txAdvice" transaction-manager="transactionManager">
    25         <!-- 做事务操作-->
    26         <tx:attributes>
    27             <!-- 设置进行事务操作的方法匹配规则,就是对什么方法进行事务操作,这里可以直接写方法名,也可以直接写*,表示对所有方法开启事务支持-->
    28             <tx:method name="*"/>
    29         </tx:attributes>
    30 
    31     </tx:advice>
    32 
    33     <!-- 3.然后配置切面-->
    34     <aop:config>
    35 
    36         <!-- 切入点-->                                  <!--service包下,所有类中的所有方法都设置为切入点-->
    37         <aop:pointcut id="servicePointcut" expression="execution(* com.learning.service..*(..))"/>
    38 
    39         <!-- 切面-->
    40         <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointcut"/>
    41     </aop:config>

    注:配置文件中,对相应步骤都有详细说明,主要分三步:1.配置事务管理;2.配置事务增强;3.进行切面配置。

    二、基于注解的方式

     1     <!-- 开启注解扫描-->
     2     <context:component-scan base-package="com.learning"/>
     3 
     4     <!-- c3p0连接池配置-->
     5     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
     6           destroy-method="close"
     7           p:driverClass="com.mysql.jdbc.Driver"
     8           p:jdbcUrl="jdbc:mysql://localhost:3306/springlearning?useUnicode=true&amp;characterEncoding=UTF-8"
     9           p:user="root"
    10           p:password=""/>
    11 
    12     <!-- 配置jdbcTemplate模板-->
    13     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
    14           p:dataSource-ref="dataSource"/> 
    17     <!--基于注解的方式,在配置文件中只需两步-->
    18 
    19     <!-- 1.配置事务,开启spring的事务管理-->
    20 
    21     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
    22           p:dataSource-ref="dataSource"/>
    23 
    24     <!--2.开启事务注解扫描-->
    25     <tx:annotation-driven transaction-manager="transactionManager"/>

    注:基于注解的方式,在配置文件中只需两步:1.配置事务管理器(不管是基于配置文件方式或者注解方式,这一步都是必须的);2.开启事务注解扫描;3.在需要进行事务操作的方法上添加注解@Transactional通过以上3个步骤即可完成方式事务的开启,注意不要忘了在所需开启事务的方法上添加注解。

    Spring事务配置不起作用可能出现的问题:

    1.是否是数据库引擎设置不对造成的【笔者就遇到了这个问题,由于笔者使用的是mysql数据,但是在创建表的时候引擎默认(mysql中引擎默认为MyISAM,是不支持事务操作的),需要修改为InnoDB,就可以支持事务操作了

    2.入口函数必须是public,否则事务不起作用。这一点由Spring的AOP特性决定的。

    这就是笔者在配置事务过程中所遇到的问题,如再遇任何问题,则继续补充。


    by Shawn Chen,2018.1.11日,晚。

  • 相关阅读:
    Windows Store App 主题动画
    Windows Store App 过渡动画
    Windows Store App 控件动画
    Windows Store App 近期访问列表
    Windows Store App 文件选取器
    Windows Store App 访问应用内部文件
    Windows Store App 用户库文件分组
    Windows Store App 获取文件及文件夹列表
    Windows Store App 用户库文件夹操作
    Windows Store App 用户库文件操作
  • 原文地址:https://www.cnblogs.com/developer_chan/p/8270765.html
Copyright © 2011-2022 走看看