MyBatis与Spring整合前后事务管理有所区别

整合前:通过

  session = sessionFactory.openSession(true);  //或者是false

设置事务是否自动提交;

整合后,在这样写就不起作用了,无论设置为true还是false  都会自动提交事务;

如果想设置事务非自动提交有以下几种方案:

  ① 创建session之后,手动拿到connection,设置事务非自动提交

  session.getConnection().setAutoCommit(false);

  ② 通过spring管理事务

    @Test
    /**
     * 测试插入数据,同时测试手动提交事务
     */
    public void test_insert() {
        System.out.println("==============插入数据==================");
        //开启事务
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) DaoApplicationContext
                .getInstance().getBean("txManager");
        TransactionStatus transactionStatus = (TransactionStatus) transactionManager
                .getTransaction(definition);

        Fh_fullnote order = new Fh_fullnote();
        order.setHf_serialid("HF100120160829155555012507");
        order.setHf_orderid("OD100120160829155555012507");
        order.setCharge_phone("18201304217");
        order.setCharge_money(50D);
        int insertRet = fh_fullnoteDao.insert(order);
        
        //提交事务
        transactionManager.commit(transactionStatus); 
        System.out.println("插入数据返回值:" + insertRet);
    }

  

  ③ 注解式事务

  首先对Dao层做一个详细的解析

  Dao层应用上下文

package ctp.demo.dao.fh.dao;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DaoApplicationContext {
    private static ApplicationContext ctx=null;
    
    public static ApplicationContext getCtx() {
        return ctx;
    }
    public static void setCtx(ApplicationContext ctx) {
        DaoApplicationContext.ctx = ctx;
    }
    
    
    public static ApplicationContext getInstance(){
        if(ctx == null){
            ctx=new ClassPathXmlApplicationContext("applicationContext-Dao.xml");
        }
        return ctx;
    }
}
DaoApplicationContext.java

相关文章: