spring 事物机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dasdfadf/article/details/84847473

1.spring事物处理机制分为两种一种为声明式事物、一种为编程式事物

声明式事物建立在AOP 基础之上

本质是对方法的拦截  即在一个方法开始之前加入一个事物 目标方法执行完成后 进行事物提交或者是回滚

好处:  将业务逻辑代码和事物代码区分 

不足: 和编程式事物相比  声明式事物最细粒度之能作用到方法 ,二编程式事物可以作用到代码块

spring 配置事物总是由3部分组成 datesource  transactionManager  和 代理机制组成

datesource 、和transactionManager 这两部分只是会根据数据访问方式有所变化

比如使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

注意:sessionFactorty和transactionManager是下面5中配置方式的基本配置,

扫描二维码关注公众号,回复: 4390434 查看本文章

第一种方式:每个Bean都有一个代理

第二种方式:所有Bean共享一个代理基类

第三种方式:使用拦截器

第四种方式:使用tx标签配置的拦截器     (常用)

第五种方式:全注解

编程式事物

Spring的编程式事务即在代码中使用编程的方式进行事务处理,可以做到比声明式事务更细粒度。有两种方式一是使用TransactionManager,

另外就是TransactionTemplate。

1)

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    private HibernateTransactionManager transactionManager;
    private DefaultTransactionDefinition def;
 
    public HibernateTransactionManager getTransactionManager() {
        return transactionManager;
    }
 
    public void setTransactionManager(HibernateTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }
 
    public void createTransactionDefinition() {
        def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
    }
 
    public void saveOrUpdate(User user) {
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            this.getHibernateTemplate().saveOrUpdate(user);
        } catch (DataAccessException ex) {
            transactionManager.rollback(status);
            throw ex;
        }
        transactionManager.commit(status);
    }
}
2)TransactionTemplate方式

ResultDto ret = null;
ret = (ResultDto) this.transactionTemplate.execute(new TransactionCallback() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
        ResultDto ret = null;
        try {
            drillTaskDao.deleteByKey(taskid);
        } catch (Exception e) {
            logger.error("delDrillTask:" + e.getMessage(), e);
            ret = ResultBuilder.buildResult(ResultBuilder.FAIL_CODE, null, ErrorCode.COM_DBDELETEERROR);
            return ret;
        }
        finally {
            status.setRollbackOnly();
        }
         
        ret = cleartaskrelativedata(taskid, appid, true);
        return ret;
    }
});
return ret;
 

猜你喜欢

转载自blog.csdn.net/dasdfadf/article/details/84847473