Spring框架学习[Spring事务处理的实现](十)

2014-11-24 03:00:34 · 作者: · 浏览: 6
itException(status, ex); throw ex; }//对提交过程中产生的错误处理 catch (Error err) { if (!beforeCompletionInvoked) { triggerBeforeCompletion(status); } doRollbackOnCommitException(status, err); throw err; } //触发提交之后的回调操作 try { triggerAfterCommit(status); } finally { triggerAfterCompletion(status, TransactionSynchronization.STATUS_COMMITTED); } } //提交完成之后清除事务相关状态 finally { cleanupAfterCompletion(status); } }

7.事务的回滚:

当在事务处理过程中产生异常,或者提交失败时,往往需要对数据库中已有的更改做回滚操作,即恢复到操作之前的状态,回滚的实现代码如下:

[java] view plaincopyprint public final void rollback(TransactionStatus status) throws TransactionException { //如果事务状态已完成,则抛出异常 if (status.isCompleted()) { throw new IllegalTransactionStateException( "Transaction is already completed - do not call commit or rollback more than once per transaction"); } DefaultTransactionStatus defStatus = (DefaultTransactionStatus) status; //处理回滚的操作 processRollback(defStatus); } //回滚操作 private void processRollback(DefaultTransactionStatus status) { try { try { //触发完成前的回调操作 triggerBeforeCompletion(status); //嵌套事务回滚处理 if (status.hasSavepoint()) { if (status.isDebug()) { logger.debug("Rolling back transaction to savepoint"); } //回滚挂起在保存点的事务 status.rollbackToHeldSavepoint(); } //当前事务中创建新事务的回滚操作 else if (status.isNewTransaction()) { if (status.isDebug()) { logger.debug("Initiating transaction rollback"); } //回滚处理,由具体的事务处理器实现 doRollback(status); } //如果在当前事务中没有新建事务 else if (status.hasTransaction()) { //如果当前事务状态为本地回滚,或全局回滚失败 if (status.isLocalRollbackOnly() || isGlobalRollbackOnParticipationFailure()) { if (status.isDebug()) { logger.debug( "Participating transaction failed - marking existing transaction as rollback-only"); } //设置当前事务状态为回滚 doSetRollbackOnly(status); } //当前事务状态没有设置为本地回滚,且没有产生全局回滚失败,则 //由线程中的前一个事务来处理回滚,这个步骤任何处理 else { if (status.isDebug()) { logger.debug( "Participating transaction failed - letting transaction originator decide on rollback"); } } } //如果当前线程没有事务 else { logger.debug("Should roll back transaction but cannot - no transaction available"); } } //对回滚操作过程中的运行时异常和错误的处理 catch (RuntimeException ex) { triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN); throw ex; } catch (Error err) { triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN); throw err; } //回滚操作完成后,触发回滚之后回调操作 triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK); } //清除回滚之后事务状态信息 finally { cleanupAfterCompletion(status); } }