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日,晚。

  • 相关阅读:
    【SQL】含有NULL值的排序
    【SQL】结构化查询语言
    【Oracle】体系结构
    【PL/SQL】匿名块、存储过程、函数、触发器
    【Linux】VMware安装VMware Tools工具
    【SQL】INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND
    Tornado源码浅析
    【Python之路】特别篇--property()函数 和 @property 装饰符
    【Python之路】特别篇--生成器(constructor)、迭代器(iterator)、可迭代对象(iterable)
    【Python之路】特别篇--基于领域驱动模型架构设计的京东用户管理后台
  • 原文地址:https://www.cnblogs.com/developer_chan/p/8270765.html
Copyright © 2011-2022 走看看