- Spring提供了对编程式事务和声明式事务的支持,编程式事务允许用户在代码中精确定义事务的边界,而声明式事务(基于AOP)有助于用户将操作与事务规则进行解耦。
- 简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现
- Spring提供两种方式的编程式事务管理,分别是:
- 使用TransactionTemplate
- 直接使用PlatformTransactionManager
使用TransactionTemplate
- 采用TransactionTemplate和采用其他Spring模板,如JdbcTempalte和HibernateTemplate是一样的方法。
- 它使用回调方法,把应用程序从处理取得和释放资源中解脱出来。
- 如同其他模板,TransactionTemplate是线程安全的
示例
TransactionTemplate tt = new TransactionTemplate(); // 新建一个TransactionTemplate Object result = tt.execute( newTransactionCallback(){ publicObject doTransaction(TransactionStatus status) { updateOperation(); returnresultOfUpdateOperation(); } }); // 执行execute方法进行事务管理 |
- 使用TransactionCallback()可以返回一个值。如果使用TransactionCallbackWithoutResult则没有返回值
使用PlatformTransactionManager
- PlatformTransactionManagerSpring是事务管理器的默认接口
示例
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); //定义一个某个框架平台的TransactionManager,如JDBC、Hibernate 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);// 回滚 } |