Rumah  >  Soal Jawab  >  teks badan

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

伊谢尔伦伊谢尔伦2743 hari yang lalu616

membalas semua(4)saya akan balas

  • 大家讲道理

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

    Tanya Baidu spring untuk pengurusan transaksi

    Yang pertama ialah mengkonfigurasi peraturan pengurusan transaksi Anda boleh merujuk kepada Baidu tentang cara menulisnya secara khusus. Saya tidak dapat menerangkannya dalam satu atau dua ayat

        <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>

    Jenis kedua menggunakan anotasi @Transactional

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

    balas
    0
  • 高洛峰

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

    Pengurusan Transaksi Terprogram MyBatis SqlSession menyediakan anda
    kaedah khusus untuk mengendalikan transaksi secara aturcara. Tetapi
    apabila menggunakan MyBatis-Spring kacang anda akan disuntik dengan Spring
    managed SqlSession atau Spring managed mapper. Ini bermakna Spring
    akan sentiasa mengendalikan transaksi anda.

    Anda tidak boleh memanggil SqlSession.commit(), SqlSession.rollback() atau
    SqlSession.close() melalui SqlSession terurus Spring. Jika anda cuba melakukannya
    begitu, pengecualian UnsupportedOperationException akan dilemparkan. Perhatikan
    kaedah ini tidak didedahkan dalam kelas pemeta yang disuntik.

    Tidak kira tetapan autokomit sambungan JDBC anda, sebarang pelaksanaan
    kaedah data SqlSession atau sebarang panggilan ke kaedah pemeta di luar
    Transaksi musim bunga akan dilakukan secara automatik.

    Jika anda ingin mengawal transaksi anda secara pengaturcaraan, sila rujuk
    kepada bab 10.6 manual rujukan Spring. Kod ini menunjukkan cara
    mengendalikan transaksi secara manual menggunakan PlatformTransactionManager
    yang diterangkan dalam bahagian 10.6.2.

    mybatis-spring

    balas
    0
  • 高洛峰

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

    Spring nampaknya tidak membenarkan penyerahan transaksi secara manual, bekas Spring akan menguruskan transaksi secara automatik!

    balas
    0
  • 阿神

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

    
    
    //使用事务处理,订单及货物订单必须同时插进2个表里面
    @Transactional(rollbackFor=Exception.class)
    public void save(PageData pd,Map<String,Integer> map,String uuid,int Uid){
        dao.save("OrderInfoMapper.saveOrderInfo", pd);
        OrderGood orderGood=new OrderGood();
        for(String gid:map.keySet()){
            Goods good=goodService.findOne(gid);
            orderGood.setGname(good.getGname());
            //Integer a=map.get(gid);
            orderGood.setOgamount(map.get(gid));
            orderGood.setGid(Integer.parseInt(gid));                
            orderGood.setOgtotalprize(map.get(gid)*good.getGprice());
            orderGood.setUid(Uid);
            orderGood.setOid(uuid);
            dao.save("OrderInfoMapper.saveOrderGood", orderGood);
            }          
                   
    }
    使用@Transactional  注解则成功解决问题,此注解是spring 的事务管理,使用前先配置如下:
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        </bean>
        <!--声明使用注解式事务-->
        <tx:annotation-driven transaction-manager="transactionManager"/>
            
        
        
        只需要在service层方法中执行多条mybatis的mapper并加上注解即可,发生异常则此方法的事务会回滚

    balas
    0
  • Batalbalas