Spring提供的TransactionTemplate 能够以编程的方式实现事务控制,是无状态而且线程安全的
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations, InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); //PlatformTransactionManager用来执行事务的提交和回滚操作。 private PlatformTransactionManager transactionManager; public TransactionTemplate() { } public TransactionTemplate(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public TransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) { super(transactionDefinition); this.transactionManager = transactionManager; } //依赖注入 public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public PlatformTransactionManager getTransactionManager() { return this.transactionManager; } @Override //执行完毕后调用 public void afterPropertiesSet() { //如果transactionManager 为空抛异常 if (this.transactionManager == null) { throw new IllegalArgumentException("Property 'transactionManager' is required"); } } @Override //进行事务处理的骨架代码,指明了事务处理的顺序 public <T> T execute(TransactionCallback<T> action) throws TransactionException { if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) { return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action); } else { //获取事务状态 TransactionStatus status = this.transactionManager.getTransaction(this); T result; try { //在doInTransaction()进行各种数据库操作 result = action.doInTransaction(status); } catch (RuntimeException ex) { rollbackOnException(status, ex); throw ex; } catch (Error err) { rollbackOnException(status, err); throw err; } catch (Throwable ex) { rollbackOnException(status, ex); throw new UndeclaredThrowableException(ex, "TransactionCallback threw undeclared checked exception"); } //没有异常就操作成功,提交 this.transactionManager.commit(status); //返回执行doInTransaction()方法后的返回值 return result; } } //事务处理回调时调用 private void rollbackOnException(TransactionStatus status, Throwable ex) throws TransactionException { logger.debug("Initiating transaction rollback on application exception", ex); try { this.transactionManager.rollback(status); } catch (TransactionSystemException ex2) { logger.error("Application exception overridden by rollback exception", ex); ex2.initApplicationException(ex); throw ex2; } catch (RuntimeException ex2) { logger.error("Application exception overridden by rollback exception", ex); throw ex2; } catch (Error err) { logger.error("Application exception overridden by rollback error", ex); throw err; } } }execute()方法内的TransactionCallback参数是个接口,在这个接口内定义了doInTransaction()方法,这样的模版代码,所以我们只要实现了TransactionCallback接口,并且在doInTransaction()方法里编写具体进行的事务处理的代码就可以了,创建TransactionTemplate 的实例需要提供一个PlatformTransactionManager的实例,比如
TransactionTemplate transactionTemplate=new TransactionTemplate(); transactionTemplate.setTransactionManager(platformTransactionManager); transactionTemplate.execute(new TransactionCallback<String>() { @Override public String doInTransaction(TransactionStatus status) { //数据库操作1 //数据库操作2 return "success"; } });1、使用Spring预定义的DefaultTransactionDefinition ,然后通过TransactionManager的getTransaction()方法首先声明事务开始 2、如果有异常发生,则使用TransactionManager的rollback()方法进行事务回滚 3、如果成功,则执行TransactionManager的commit()方法进行事务提交
