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

2014-11-24 03:00:34 · 作者: · 浏览: 10
对事务挂起操作中产生异常和错误的处理 catch (RuntimeException ex) { doResumeSynchronization(suspendedSynchronizations); throw ex; } catch (Error err) { doResumeSynchronization(suspendedSynchronizations); throw err; } } //如果事务是激活的,但是事务同步机制不是激活的,则只需要保存事务状态,不//需要重置事务相关的线程局部变量 else if (transaction != null) { Object suspendedResources = doSuspend(transaction); return new SuspendedResourcesHolder(suspendedResources); } //事务和事务同步机制都不是激活的,则不要想处理 else { return null; } }

6.事务的提交:

当事务方法处理成功之后,需要将当前事务提交,将更改同步到数据库中,事务提交的实现源码如下:

[java] view plaincopyprint public final void commit(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; //如果事务执行状态时回滚 if (defStatus.isLocalRollbackOnly()) { if (defStatus.isDebug()) { logger.debug("Transactional code has requested rollback"); } //处理事务回滚 processRollback(defStatus); return; } //如果事务没有被标记为回滚时提交,且事务状态时全局回滚 if (!shouldCommitOnGlobalRollbackOnly() && defStatus.isGlobalRollbackOnly()) { if (defStatus.isDebug()) { logger.debug("Global transaction is marked as rollback-only but transactional code requested commit"); } //回滚处理 processRollback(defStatus); //如果事务状态时新事务,或者在全局回滚时失败 if (status.isNewTransaction() || isFailEarlyOnGlobalRollbackOnly()) { throw new UnexpectedRollbackException( "Transaction rolled back because it has been marked as rollback-only"); } return; } //处理提交 processCommit(defStatus); } //提交处理操作 private void processCommit(DefaultTransactionStatus status) throws TransactionException { try { boolean beforeCompletionInvoked = false; try { //事务提交的准备工作,有具体的事务处理器完成 prepareForCommit(status); triggerBeforeCommit(status); triggerBeforeCompletion(status); beforeCompletionInvoked = true; boolean globalRollbackOnly = false; //如果事务状态是新事务,或者全局回滚失败 if (status.isNewTransaction() || isFailEarlyOnGlobalRollbackOnly()) { //设置事务全局回滚 globalRollbackOnly = status.isGlobalRollbackOnly(); } //嵌套事务处理 if (status.hasSavepoint()) { if (status.isDebug()) { logger.debug("Releasing transaction savepoint"); } //释放挂起事务保存点 status.releaseHeldSavepoint(); } //如果当前事务是新事务 else if (status.isNewTransaction()) { if (status.isDebug()) { logger.debug("Initiating transaction commit"); } //调用具体事务处理器提交事务 doCommit(status); } //如果事务被标记为全局回滚 if (globalRollbackOnly) { throw new UnexpectedRollbackException( "Transaction silently rolled back because it has been marked as rollback-only"); } } //提交过程中产生未预期的回滚异常,则回滚处理 catch (UnexpectedRollbackException ex) { triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK); throw ex; } //对提交过程中产生的事务异常处理 catch (TransactionException ex) { //如果回滚失败,则进行回滚异常处理 if (isRollbackOnCommitFailure()) { doRollbackOnCommitException(status, ex); } else { triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN); } throw ex; } //对提交过程中产生的异常处理 catch (RuntimeException ex) { //如果不是在完成前调用的 if (!beforeCompletionInvoked) { //触发完成前的回调方法 triggerBeforeCompletion(status); } //进行回滚异常处理 doRollbackOnCommitException(status, ex); throw ex; } //对提交过程中产生的错误处理 catch (Error err) { if (!beforeCompleti