2019独角兽企业重金招聘Python工程师标准>>>

采用的基本搭建环境:SpringMVC、MyBatis、MySQL、tomcat
        Spring事务管理分解了传统的全局事务管理和本地事务管理的劣势,使得在任何环境中都可以使用统一的事务管理模型,你可以写一次代码,然后在不同的环境从你的代码里面配置不同的事务管理策略,Spring提供两种事务管理策略:一种是声明式事务管理策略,另一种是编程式事务管理策略,这里主要介绍声明式事务管理策略
        由于采用的是SpringMVC、 MyBatis,故统一采用了标注来声明Service、Controller
由于服务器启动时的加载配置文件的顺序为web.xml---root-context.xml(Spring的配置文件)---servlet-context.xml(SpringMVC的配置文件),由于root-context.xml配置文件中Controller会先进行扫描装配,但是此时service还没有进行事务增强处理,得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力),所以我们必须在root-context.xml中不扫描Controller,配置如下:

<!-- 自动扫描组件,这里要把controler下面的 controller去除,他们是在spring3-servlet.xml中配置的,如果不去除会影响事务管理的。   --><context:component-scan base-package="com.sence"><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>

在servlet-context.xml中扫描Controller同时不扫描Service,配置如下:

<!-- 扫描所有的controller 但是不扫描service-->
<context:component-scan base-package="com.sence">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>

下面就可以进行配置声明式事务管理了,配置如下:

<!-- transaction manager, use DataSourceTransactionManager --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- spring declarative transaction management -->
<aop:config>
<aop:pointcut id="fooServiceMethods"
expression="execution(* com.sence.*.service.impl.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="find*" read-only="true"/><tx:method name="load*" read-only="true"/><tx:method name="*" rollback-for="CustomException"/></tx:attributes>
</tx:advice>

到此我的配置完成了,但是经过我的测试,当我往MySQL数据库表批量增加对象时,当其中一个对象出现错误,抛出CustomException事务却不回滚,这个真是令人头疼,于是我继续查找,步骤如下:
1. 查找是否声明式事务管理有误,如切入点写错了
2. 查找Controller扫描部分配置是否正确
        但是这两点我都查了,还是事务没有回滚,这个时候我没办法了,只能动用终极武器了:查看源码,开始debug程序,发现进入到了事务,并且出现了异常,捕获后进入到了回滚程序,但是数据库却没有回滚,为了避免Spring自己的AbstractPlatformTransactionManager的干扰,我自己定制了一个事务管理类并继承配置文件中的DataSourceTransactionManager类,这样可以清楚的看到程序的运行轨迹,继续DEBUG,还是出现了异常,捕获后进入到了回滚程序,但是数据库却没有回滚,此刻我开始怀疑MySQL数据库的事务支持功能了,于是网上查找MySQL对事务的支持,发现MySQL4.0以后可以支持事务,但是MySql的数据表分为两类,一类是传统的数据表,另一类则是支持事务的数据表。支持事务的数据表分为两种:InnoDB和BerkeleyDB
       使用一下命令:show create table ***  查看我的数据库表的属性才发现我的表原来是传统类型的表,于是我使用navicat更改了表的类型为:InnoDB,然后运行程序发现事务回滚了
       到此SpringMVC声明式事务管理配置完成,并运行正确

转载于:https://my.oschina.net/u/178116/blog/519688

SpringMVC、MyBatis声明式事务管理相关推荐

  1. spring事物配置,声明式事务管理和基于@Transactional注解的使用

    事物管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或 ...

  2. spring事务配置,声明式事务管理和基于@Transactional注解的使用

    事务管理对于企业应用来说是至关重要的,好使出现异常情况,它也可以保证数据的一致性. spring提供了几个关于事务处理的类: TransactionDefinition //事务属性定义 Transc ...

  3. spring声明式事务管理方式( 基于tx和aop名字空间的xml配置+@Transactional注解)

    1. 声明式事务管理分类 声明式事务管理也有两种常用的方式, 一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解. 显然基于注解的方式更简单易用,更清爽. ...

  4. 事务(注解声明式事务管理)

    1.什么事务 (1)事务是数据库操作最基本单元,逻辑上一组操作,要么都成功,如果有一个失败所有操作都失败 2.事务四个特性(ACID) (1)原子性 (2)一致性 (3)隔离性 (4)持久性 1.原子 ...

  5. Spring框架声明式事务管理

    Spring框架声明式事务管理 底层就是AOP原理,面向切面编程 在不修改源码的情况下,对方法进行增强 Spring框架事务管理相关类和API PlatformTransactionManager 平 ...

  6. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  7. Spring-09 整合mybatis声明式事务

    声明式事务 回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎!事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单 ...

  8. Spring不同事务管理方式与声明式事务管理局部回滚处理方案

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分.  DataS ...

  9. Spring声明式事务管理中的事务回滚

    一:使用 本文在spring + spring mvc + mybatis中使用 第一步配置xml:注意xml最前面tx名称空间一定要配置 <beans xmlns="http://w ...

最新文章

  1. sql的不等于条件优化_SQL优化案例(2):OR条件优化
  2. mysql存储引擎6_Mysql各种存储引擎对比总结
  3. 网络数据嗅探工具HexInject
  4. Boost:与文件系统相关的BOOST_TEST_EQ测试
  5. PHP校验ISBN码的函数
  6. 电脑关闭计算机怎么重启计算机,教您电脑关机后总是重启怎么办
  7. 【HDU - 1257】最少拦截系统 (标解dp,贪心可过,最长上升子序列类问题)
  8. Python random模块常用方法的使用
  9. 简要介绍BASE64、MD5、SHA、HMAC几种方法。
  10. Java Integer类中的parseInt和valueOf的区别
  11. 小米大杀器稳了?队友泄露小米MIX4 5G预售页面...
  12. Linux 命令 - touch
  13. 面对网络灾难风暴Fortinet安立方打造完美方舟
  14. rf接口自动化之结果校验
  15. 修改表字段长度的操作,对业务是否有影响?
  16. Appium 基础教程
  17. Camera电路、图像传感器问题汇总
  18. 产品战略与战术之行业分析
  19. 后台权限管理层级分配两个必要的递归函数
  20. Appium 手机 App 自动化代码说明_启动微信app

热门文章

  1. 数学大神攻克猜字游戏Wordle,求解算法成绩逼近理论极限,连信息论都用上了...
  2. 中国如何赢得新一轮超算竞赛?关键在向数据密集型超算转变
  3. 免费试用人数太多,微软Windows 365云电脑服务器炸了,官方紧急暂停
  4. MindSpore布道师队伍招募开始,助力小白成为大牛!
  5. 波士顿动力副总给我写了一封信,在我莫名膨胀之后
  6. Hi,欢迎加入量子位AI社群
  7. flutter 如何自定义一个loadmore / 加载更多
  8. Retrofit源码分析一 概览
  9. python学习(2)--变量与表达式
  10. 华为交换机SSH登录失败原因