java - mybatis怎么处理事务问题
伊谢尔伦
伊谢尔伦 2017-04-18 10:51:03
0
4
646

我用的mybatis是基于SqlSessionTemplate实现的,如下:

@Repository("daoSupport")
public class DaoSupport implements BaseDAO {

    @Resource(name = "sqlSessionTemplate")
    private SqlSessionTemplate sqlSessionTemplate;
    
    /**
     * 保存对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object save(String str, Object obj){
        return sqlSessionTemplate.insert(str, obj);
    }
    
    /**
     * 批量更新
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object batchSave(String str, List objs){
        return sqlSessionTemplate.insert(str, objs);
    }
    
    /**
     * 修改对象
     * @param str
     * @param obj
     * @return
     * @throws Exception
     */
    public Object update(String str, Object obj){
        Integer count=sqlSessionTemplate.update(str, obj);

@Service

public class OrderInfoService  {

    @Resource(name = "daoSupport")
    private DaoSupport dao;
        
    
    @SuppressWarnings("unchecked")
    public List<PageData> getPerson() {
         List<PageData> a =(List<PageData>)dao.findAllList(
                    "OrderInfoMapper.getOrderInfo");
         return a;
            
        }
    public void save(PageData pd){
        dao.save("OrderInfoMapper.saveOrderInfo", pd);
    }
    public void update(PageData pd){
        dao.update("OrderInfoMapper.updateOrder", pd);
    }
    
    @SuppressWarnings("unchecked")
    public List<PageData> list(PageData pd){
        return (List<PageData>)dao.findForList("OrderInfoMapper.getOrderInfo", pd);
    }

在xml文件里面写对应sql的Mapper,
我想在调用service层的方法操作数据库时,几条sql语句同时commit,其中有一条失败则全部不执行,就和jdbc那样先设置不自动commit,然后在commit那种,要在哪里配置或调用啥方法实现?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
大家讲道理

请百度spring的事务管理

第一种,配置事务管理的规则,具体怎么写可以再百度,一两句说不清

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <aop:config>
        <aop:pointcut id="interceptorPointCuts" expression="execution(* com.web..*.services..*Impl.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts"/>
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>for="java.lang.Exception"/> -->
        </tx:attributes>
    </tx:advice>

第二种使用注解@Transactional

   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--声明使用注解式事务-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
小葫芦

编程式事务管理 MyBatis SqlSession 为您提供
以编程方式处理事务的特定方法。但是,当使用 MyBatis-Spring 时,您的 bean 将被注入 Spring 管理的 SqlSession 或 Spring 管理的映射器。这意味着 Spring
将始终处理您的事务。

您不能通过 Spring 管理的 SqlSession 调用 SqlSession.commit()、SqlSession.rollback() 或

SqlSession.close()。如果您尝试这样做,将会抛出 UnsupportedOperationException 异常。注意

这些方法不会在注入的映射器类中公开。

无论您的 JDBC 连接的自动提交设置如何,SqlSession 数据方法的任何执行
或对

Spring 事务之外的映射器方法的任何调用都将自动提交。


如果您想以编程方式控制事务,请参阅
Spring 参考手册的第 10.6 章。此代码展示了如何使用第 10.6.2 节中描述的 PlatformTransactionManager

手动处理事务。



mybatis-spring

小葫芦

Spring好像不允许手动提交事务,Spring容器会自动管理事务!

阿神

雷雷 雷雷

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板