Spring提供了对编程式事务和声明式事务的支持,编程式事务容许用户在代码中精肯定义事务的边界,而声明式事务(基于AOP)有助于用户将操做与事务规则进行解耦。
简单地说,编程式事务侵入到了业务代码里面,可是提供了更加详细的事务管理;而声明式事务因为基于AOP,因此既能起到事务管理的做用,又能够不影响业务代码的具体实现。java
Spring提供两种方式的编程式事务管理,分别是:使用TransactionTemplate和直接使用PlatformTransactionManager。spring
采用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则没有返回值。编程
示例代码以下:安全
//定义一个某个框架平台的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);// 回滚 }
Spring配置文件中关于事务配置老是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,不管哪一种配置方式,通常变化的只是代理机制这部分。框架
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,好比使用Hibernate进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。this
根据代理机制的不一样,总结了五种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>