SpringMVC+MyBatis配置声明式事务的问题
来源:互联网 发布:ie11不支持javascript 编辑:程序博客网 时间:2024/06/03 05:08
我的环境是Spring、SpringMVC、MyBatis3、MariaDB和Tomcat
我遇到的问题是事务不起作用,虽然多次数据库操作中有异常出现,但还是部分提交,并没有回滚;
我的配置是这样的:
- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <tx:advice id="txAdvice" transaction-manager="transactionManager">
- <tx:attributes>
- <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
- <tx:method name="insert*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
- <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
- <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception" />
- <tx:method name="*" propagation="REQUIRED" read-only="true"/>
- </tx:attributes>
- </tx:advice>
- <aop:config>
- <aop:pointcut id="pc" expression="execution(* com.xss.*.*.service.impl.*.*(..))" />
- <aop:advisor pointcut-ref="pc" advice-ref="txAdvice" />
- </aop:config>
这段配置应该是没有问题的,于是我就想会不会是MariaDB的存储引擎不支持事务,于是从网上找到了这么一段话:
MariaDB默认的存储引擎是Maria,不是MyISAM。Maria可以支持事务,但是默认情况下没有打开事务支持,因为事务支持对性能会有影响。 可以通过以下语句,转换为支持事务的Maria引擎:
ALTER TABLE ‘tablename’ ENGINE=MARIA TRANSACTIONAL=1;
但我按照上面所述修改了数据库的存储引擎,事务仍然不起作用。
注:在MariaDB(MySQL)数据中,InnoDB和BerkeleyDB两种存储引擎是支持事务的,MariaDB引进的新引擎Aria默认不支持事务,可以通过上面的代码修改。
纠结了许久终于发现还是自己的配置出了问题,但并非是事务配置有问题,而是Spring组件扫描配置出了问题。
由于采用的是SpringMVC、 MyBatis,故统一采用了@Service、@Controller注解来声明Service和Controller 组件,于是我在Spring和SpringMVC的配置文件均用一行代码配置了Spring的组件自动扫描:
- <context:component-scan base-package="com.xss.crm" />
而由于服务器启动时的加载Spring相关配置文件的顺序为applicationContext.xml(Spring的配置文件) ---> applicationContext-mvc.xml(SpringMVC的配置文件),按照上面的配置Spring加载applicationContext.xml配置文件时会加载@Controller注解标注的Controller组件,并且对其进行扫描装配,但是此时的Service还没有进行事务增强处理,得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力),所以我们应用在applicationContext.xml(Spring配置文件)中不扫描Controller,而在applicationContext-mvc.xml(SpringMVC配置文件)中不扫描Service。
于是Spring和SpringMVC配置应该像下面的这样:
applicationContext.xml(Spring配置文件)
- <!-- 自动扫描组件,这里不扫描 controller,它们是在ApplicationContext-mvc.xml中配置扫描的,如果不去除会影响事务管理 -->
- <context:component-scan base-package="com.xss.crm">
- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
applicationContext-mvc.xml(SpringMVC配置文件)
- <!-- 扫描所有的controller 但是不扫描service-->
- <context:component-scan base-package="com.xss.crm">
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
- </context:component-scan>
修改配置后再测试,事务成功回滚。
0 0
- SpringMVC+MyBatis配置声明式事务的问题
- SpringMVC+MyBatis配置声明式事务的问题
- SpringMVC+MyBatis配置声明式事务的问题
- SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置
- springMVC + mybatis 事务配置
- spring + springMVC声明式事务失效问题
- SpringMVC、MyBatis声明式事务管理+AOP配置
- Mybatis+springMVC下事务控制的配置
- SpringMVC结合Mybatis事务失效的问题
- SpringMVC Mybatis的事务回滚问题
- spring+springMVC+mybatis:事务配置
- SpringMVC事务配置问题
- springMVC mybatis mysql 配置 事务不起作用的原因
- springmvc+mybatis下基于注解的Atomikos分布式事务配置
- SpringMVC、MyBatis声明式事务管理
- SpringMVC、MyBatis声明式事务管理
- SpringMVC、MyBatis声明式事务管理
- SpringMVC、MyBatis声明式事务管理
- 数据库事物与隔离级别
- Binary XML file line #2: Error inflating class <unknown>
- JDK8中的ConcurrentHashmap底层实现
- Eigen——四元数笔记
- Shell脚本8种字符串截取方法总结
- SpringMVC+MyBatis配置声明式事务的问题
- Xilinx zynqMP开发基本步骤
- cookie插件的使用
- android edittext 禁用软键盘调用
- timestamp一些用法转载
- Android Studio部分快捷键
- poj 3261 最长可重叠k次子串
- 了解XMind的思维导图结构
- windows下boost的安装与初试