Spring+Mybatis,事务配置是按照官网上配的
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="initialPoolSize" value="${c3p0.initialPoolSize}" />
<property name="minPoolSize" value="${c3p0.minPoolSize}" />
<property name="maxPoolSize" value="${c3p0.maxPoolSize}" />
<property name="acquireIncrement" value="${c3p0.acquireIncrement}" />
<property name="maxIdleTime" value="${c3p0.maxIdleTime}" />
<property name="maxStatements" value="${c3p0.maxStatements}" />
</bean>
<!-- 把数据源通过spring注入mybatis的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- ScanMapperFiles,自动扫描所有Mapper映射文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bigplayer.test.mapper" />
</bean>
<!-- 事务处理管理器 ,事务管理器指定的 DataSource 必须和用来创建 SqlSessionFactoryBean 的 是同一个数据源,否则事务管理器就无法工作了-->
<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" no-rollback-for="java.lang.RuntimeException"/>
<tx:method name="insert*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.RuntimeException" />
<tx:method name="update*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />
<tx:method name="find*" propagation="SUPPORTS"/>
<tx:method name="get*" propagation="SUPPORTS"/>
<tx:method name="select*" propagation="SUPPORTS"/>
<tx:method name="*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
<!-- 配置事务切入点 -->
<aop:config>
<!--把事务控制在Service层-->
<aop:pointcut id="bussinessService"
expression="execution(public
* com.bigplayer.test.service.*.*(..))" />
<!-- 指定bussinessService切入点应用txAdvice处理器,即该切入点的所有符合特征的方法均具备了事务性 -->
<aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
</aop:config>
注意这句<tx:method name="*" propagation="SUPPORTS" />
然后我先弄了一个TestService接口,只有一个方法testDao()
而后弄了一个UserInfoService接口
public abstract void insertUserRegister(UserInfo userInfo);
public abstract UserInfo selectUserLogin(Integer id);
public abstract List<UserInfo> selectAllUser();
public abstract void updateUserInfo(UserInfo userInfo);
然后分别实现了TestService接口和UserInfoService接口,其中UserInfoService接口的实现类UserInfoServiceImpl的四个方法在独立工作时都是正常的
TestService的TestServiceImpl实现类的方法内容是这样的
private UserInfoService userInfoService;
public UserInfoService getUserInfoService() {
return userInfoService;
}
@Resource
public void setUserInfoService(UserInfoService userInfoService) {
this.userInfoService = userInfoService;
}
@Override
public UserInfo testDao() {
UserInfo userInfo = userInfoService.selectUserLogin(1); //此时数据库时空的,查到的数据为null
if (userInfo != null) {
logger.log(Level.INFO, userInfo.getUserName());
}
else {
logger.log(Level.INFO, "不存在该数据");
}
UserInfo userInfo2 = new UserInfo();
userInfo2.setUserName("4sdzfasrtxdh56");
userInfo2.setPassword("asafdsfdf");
userInfoService.insertUserRegister(userInfo2); //插入新数据
userInfo = userInfoService.selectUserLogin(1); //再次查询
if (userInfo != null) {
logger.log(Level.INFO, userInfo.getUserName());
}
else {
logger.log(Level.INFO, "不存在该数据");
}
return null;
}
外部调用这段代码
public static void main(String[] args) {
System.out.println( "Hello Mybatis!" );
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
TestService testService = context.getBean(TestService.class);
testService.testDao();
//logger.log(Level.INFO, testService.selectUserLogin(1).getUserName());
}
这段代码,就是简单的先查询数据库中不存在的一个数据,而后插入这个数据,再次查询这行数据
根据单独测试表明,执行插入数据库,数据库里立即就有了数据,但是,奇怪的是,selectUserLogin查不出来。
想修正这个问题也很简单,事务配置的那句<tx:method name="*" propagation="SUPPORTS" />,不传播级别由SUPPORTS改成REQUIRED立即迎刃而解。
但是我想不清楚理由,TestServiceImpl由spring生成,它内部的userInfoService肯定被事务增强过,因此插入调用时应该立即起效,单步测试证明也确实起效了,而TestService此时本身是工作在SUpport传播级别下的,为什么此时它调用了同样是SUPPORT级别的userInfoService.selectUserLogin方法,会查不出刚刚插入的数据,userInfoService.insertUserRegister本身已经被事务加强,调用结束时就应该插入完毕了。原因到底在哪里
问题补充:补充一点,通过观察sql语句发现,第二次查询的时候mybatis并没有去查数据库,而是直接从缓存里取的数据。也就是说这更像是缓存没有被更新。进一步测试表明,把insert换成update,却一切正常,能得到更新的数据
相关推荐
Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+MyBatis实现的学生信息管理系统源码,SSM+Vue的学生管理系统。 Java基于Spring+SpringMVC+...
校社联社团管理系统(Spring MVC+Spring+Mybatis+Redis),用来记录进度,和保存文件,完成一定阶段都上传到小组仓库中。 校社联社团管理系统(Spring MVC+Spring+Mybatis+Redis),用来记录进度,和保存文件,完成...
总的来说,"struts2+spring+mybatis+easyui"的实现是一个标准的Java Web项目结构,它利用Maven进行构建管理,通过整合四个组件,实现了后端的业务逻辑处理、数据访问和前端的用户界面展示。这种架构在实际开发中具有...
完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统(RESTful API+redis).zip 完善的Spring+SpringMVC+Mybatis+easyUI后台管理系统...
SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+Mybatis集成开发环境SpringMVC+Spring+...
SSM(spring+spring MVC+mybatis)开发学生信息后台管理系统,实现学生增删改查功能设计一个简单的学生信息管理系统,要求使用SSM框架技术整合实现,用户登录后能够通过Web页面添加、删除、修改和查询学生信息 ...
基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis+Maven项目案例 基于SpringMVC+Spring+MyBatis...
在实际项目中,开发者会创建一个 SqlSessionFactoryBean,配置数据源和MyBatis的相关配置文件,然后通过 Spring 的 Bean 注册机制将 SqlSessionFactory 注入到需要的地方。 在《spring+mybatis 企业应用实战》的...
"SpringMvc+Spring+Mybatis+Maven+注解方式"是一个经典的Java后端技术栈,它整合了四个关键组件,为开发人员提供了强大的工具和框架支持。下面将详细讲解这四个组件及其整合方式。 1. **Spring Framework**: ...
使用环境:MyEclipse/Eclipse + Tomcat + MySQL。 使用技术:Spring MVC + Spring + MyBatis / JSP + Servlet + JavaBean + JDBC。
基于SpringMVC+Spring+MyBatis个人技术博客系统源码.zip 完整代码,可运行 项目描述 基于SSM实现的一个个人博客系统,适合初学SSM和个人博客制作的同学学习。有了这个源码,直接买了阿里云或腾讯服务器,就可以部署...
基于 SpringBoot + Spring + SpringMvc + Mybatis + Shiro+ Redis 开发单点登录管理系统 基于 SpringBoot + Spring + SpringMvc + Mybatis + Shiro+ Redis 开发单点登录管理系统 基于 SpringBoot + Spring + ...
Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用...
SSM(Spring MVC + Spring + MyBatis)是Java Web开发中常见的三层架构组合,它将Spring MVC作为表现层框架,Spring作为业务层容器,MyBatis作为数据访问层框架。下面将详细介绍这三个组件以及它们如何协同工作。 *...
基于Spring+SpringMVC+Mybatis架构的博客系统:博客管理、图表数据、日志分析、访问记录、图库管理、资源管理、友链通知等。良好的页面预加载,无限滚动加载,文章置顶,博主推荐等。提供 用户端+管理端 的整套系统...
在Struts2+Spring+MyBatis的架构中,MyBatis负责与数据库交互,通过XML或注解方式配置SQL语句,使得数据库操作更加灵活且易于维护。 **整合过程** 1. **配置Spring**:创建Spring配置文件,定义Bean,包括Action、...
使用环境:MyEclipse/Eclipse + Tomcat + MySQL。 使用技术:Spring MVC + Spring + MyBatis / JSP + Servlet + JavaBean + JDBC。
中秋博饼游戏(Swing+Spring+MyBatis).zip中秋博饼游戏(Swing+Spring+MyBatis).zip 中秋博饼游戏(Swing+Spring+MyBatis).zip中秋博饼游戏(Swing+Spring+MyBatis).zip 中秋博饼游戏(Swing+Spring+MyBatis).zip中秋博饼...
基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+MyBatis+Maven项目案例源码+数据库.zip 基于SpringMVC+Spring+...
Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境