spring+mybatis事务不回滚

对spring,mybatis进行整合时发现事务不能进行回滚处理,上网查了很多资料依旧还没解释,很多都是说要抛出一个runtimeException才能回滚的,但尝试过多种还不能,代码如下:
applicationContext.xml

...
<!-- 定义易受环境影响的变量 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>classpath*:/jdbc.properties</value>
</list>
</property>
</bean>

<!-- 扫描业务组件 -->
<!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->
<context:component-scan base-package="com.myframe" />
<context:component-scan base-package="com.topone" />

<!-- 数据源配置, 使用应用中的DBCP数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- Connection Info -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.databaseurl}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

<!-- Connection Pooling Info -->
<property name="initialSize" value="${dbcp.initialSize}" />
<property name="maxActive" value="${dbcp.maxActive}" />
<property name="maxIdle" value="${dbcp.maxIdle}" />
<property name="maxWait" value="${dbcp.maxWait}" />
</bean>

<!-- jdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg>
<ref bean="dataSource" />
</constructor-arg>
</bean>

<!-- define the SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="typeAliasesPackage" value="com.myframe,com.topone" />
<property name="configLocation" value="classpath:/spring/mybatis_configuration.xml"/>
<property name="mapperLocations">
<list>
<value>classpath*:com/myframe/security/mapper/*.xml</value>
<value>classpath*:com/topone/**/**/mapper/*.xml</value>
</list>
</property>
</bean>
<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.myframe,com.topone" />
</bean>

<bean id="gridDao" class="com.myframe.admin.grid.GridDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>


<!-- transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<!-- 使用annotation定义事务-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

...


BolgService:

@Service
@Transactional(rollbackFor=Exception.class)
public class BlogService {
@Autowired
private BlogMapper blogMapper;
@Autowired
private BlogflowService blogflowService;

//保存数据
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, readOnly=true)
public String save(Blog entity, Map<String,String> map) throws Exception{
...
int isok = blogMapper.save(entity); //没发生回滚
BlogFlow vo = new BlogFlow();
//get/set方法
vo.setId();
...
blogflowService.save(vo); //调用blogflowService保存方法
...
}
}


BolgFlowService:

@Service
@Transactional(rollbackFor=Exception.class)
public class BlogflowService {
@Autowired
private BlogMapper blogflowMapper;

//保存数据
@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, readOnly=true)
public String save(Blog entity, Map<String,String> map) throws Exception{
...
entity.setTouserid(null); //故意设置为null,抛出异常
int isok = blogflowMapper.save(entity);
...
}
}


查看数据库后,由于bolgFolw设置为null了,抛出异常,所以没有增加到数据库,但bolgService里已经将一条记录添加数据库里了,没有发生回滚事件,请问是那里的设置出问题了呢,如果用编码式来控制的话是可以回滚的。估计应该是配置或代码写得不对的问题,但看了别人的例子,也是这样写的,不明白原因在那里。

另外,我是用*mapper.java这种方式来实现dao层来。

目录路径为:

com
topone
approval
blog
service
mapper
contorller
entity
blogflow
service
mapper
contorller
entity

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMyBatis是两个非常流行的Java开发框架,可以很好地支持双数据事务。 在Spring中配置多数据源,我们需要使用`@Configuration`注解将Java类标记为配置类,并通过`@Bean`注解来声明并注册多个数据源。对于每个数据源,我们需要配置对应的数据源对象、事务管理器和MyBatis的SqlSessionFactoryBean。然后,使用`@Primary`注解标记一个数据源为主数据源,它将作为默认的数据源。 接下来,在事务的配置中,我们需要使用`@EnableTransactionManagement`注解开启Spring事务管理功能,并使用`@Transactional`注解来标记需要进行事务管理的方法。在方法内部,我们可以使用`TransactionTemplate`或`PlatformTransactionManager`进行事务的控制。 在使用MyBatis时,我们可以通过`@MapperScan`注解来自动扫描并注册MyBatis的Mapper接口。在进行事务配置时,可以使用`@Transactional`注解来标记需要进行事务管理的方法,从而确保在执行数据库操作时,能够正确地开启、提交或回滚事务。 在使用双数据源时,我们需要在方法或类的上方使用`@Transactional(value = "transactionManager")`注解来指定需要使用哪个数据源的事务管理器。这样,在执行相关操作时,Spring就会根据指定的数据源来管理事务,保证数据的一致性。 总结一下,SpringMyBatis提供了完善的支持来实现双数据事务。我们可以通过合理的配置和注解来实现多个数据源的管理,并使用事务注解来控制事务的开启、提交和回滚。这样,就可以在一个应用程序中同时访问和操作多个数据源,保证数据的一致性和完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值