搜尋

首頁  >  問答  >  主體

java - mybatis怎么处理事务问题

我用的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那种,要在哪里配置或调用啥方法实现?

伊谢尔伦伊谢尔伦2803 天前652

全部回覆(4)我來回復

  • 大家讲道理

    大家讲道理2017-04-18 10:53:03

    請百度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"/>

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 10:53:03

    編程序事務管理 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

    回覆
    0
  • 高洛峰

    高洛峰2017-04-18 10:53:03

    Spring好像不允許手動提交事務,Spring容器會自動管理事務!

    回覆
    0
  • 阿神

    阿神2017-04-18 10:53:03

    雷雷 雷雷

    回覆
    0
  • 取消回覆