【求助】像我这样的需求该怎么配置mybatis事务?????


先说一下框架配置
Spring+SpringMVC+mybatis

现在的mybatis的事务级别是jdbc级别(不知道是不是这么叫):就是单条语句执行后提交事务,如果出现异常则回滚!
但是现在经常遇到的问题是:一次操作需要往多个表中插入数据,但是经常在往多个表里面查数据的时候如果其中一张表的插入出现了异常,应该将之前做的所有操作都回滚。例如说
有5个表 A B C D E
只有这5张表插入的数据都成功了,才表明这一次请求成功了!
但是现在如果插到C表时除了异常,那么只会回滚C表这次操作的数据,但是AB这两张表已经插进去了!这样就造成有垃圾数据了!
能不能将这五次操作一并提交事务 ?
不知道该怎样解决像我这样的问题???求大神!

spring-mvc java mybatis JSP spring

八云紫蓝橙 9 years, 7 months ago

在spring配置文件添加事务管理


 xml


 <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

dataSource是数据源,你应该已经配置过了,名字可能不一样

在需要使用事务的方法上添加注解,如:


 java


 @Transactional
public void addEntity(Entity entity) {
    XXdao.save(entity);
    YYdao.save(entity);
}

这样只要方法出现运行时异常就会回滚方法内所有的数据库操作。

如果一个类内的所有方法都需要事务管理,可以把 @Transactional 注解放在类名上面,这样这个类里面所有的方法都支持事务了。

ddps2 answered 9 years, 7 months ago

将插入五张表封装在service的一个方法里,将Spring事务添加在service层


 public class ServiceDemo{
    public void insert(){
        //insert 1
        //insert 2
        //insert 3
        //insert 4
        //insert 5
    }
}

exalice answered 9 years, 7 months ago

用spring来管理事务,在spring中配置mybatis的事务,service方法级别上加


 @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void xxxService(xxx xxx){
    //do something
}

整个方法中有异常都会回滚。

小小的乱乱 answered 9 years, 7 months ago

操作一张表使用一个dao的方法,一个业务使用一个service方法,在service里面调用dao,如果某一种业务,要操作5张表,那么在service里面调用5个不同的dao,然后aop配置事务时,切在service层,这样,就会保证这5种操作是同一个事务。

干死大奎神啊 answered 9 years, 7 months ago

Your Answer