Spring编程式和声明式事务

1.编程式事务

1.1 编程式和声明式事务的区别

Spring提供了对编程式事务和声明式事务的支持,编程式事务容许用户在代码中精肯定义事务的边界,而声明式事务(基于AOP)有助于用户将操做与事务规则进行解耦。 
简单地说,编程式事务侵入到了业务代码里面,可是提供了更加详细的事务管理;而声明式事务因为基于AOP,因此既能起到事务管理的做用,又能够不影响业务代码的具体实现。java

1.2 如何实现编程式事务?

Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager。spring

1.2.1 使用TransactionTemplate

采用TransactionTemplate和采用其余Spring模板,如JdbcTempalte和HibernateTemplate是同样的方法。它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。如同其余模板,TransactionTemplate是线程安全的。代码片断:数据库

TransactionTemplate tt = new TransactionTemplate(); // 新建一个TransactionTemplate
    Object result = tt.execute(
        new TransactionCallback(){  
            public Object doTransaction(TransactionStatus status){  
                updateOperation();  
                return resultOfUpdateOperation();  
            }  
    }); // 执行execute方法进行事务管理

使用TransactionCallback()能够返回一个值。若是使用TransactionCallbackWithoutResult则没有返回值。编程

1.2.2 使用PlatformTransactionManager

示例代码以下:安全

//定义一个某个框架平台的TransactionManager,如JDBC、Hibernate
    DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); 
    // 设置数据源
    dataSourceTransactionManager.setDataSource(this.getJdbcTemplate().getDataSource());
    // 定义事务属性 
    DefaultTransactionDefinition transDef = new DefaultTransactionDefinition();
    // 设置传播行为属性 
    transDef.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
    // 得到事务状态 
    TransactionStatus status = dataSourceTransactionManager.getTransaction(transDef); 
    try {
        // 数据库操做
        dataSourceTransactionManager.commit(status);// 提交
    } catch (Exception e) {
        dataSourceTransactionManager.rollback(status);// 回滚
    }

2.声明式事务

Spring配置文件中关于事务配置老是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,不管哪一种配置方式,通常变化的只是代理机制这部分。框架

DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,好比使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。this

2.1 配置方式

根据代理机制的不一样,总结了五种Spring事务的配置方式:spa

(1)每一个Bean都有一个代理线程

(2)全部Bean共享一个代理基类代理

(3)使用拦截器

(4)使用tx标签配置的拦截器

(5)全注解

<!-- 定义事务 -->
	<bean id="transactionManager" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
相关文章
相关标签/搜索