Spring的事务是如何回滚的/Spring的事务管理是如何实现的
数据库(Spring事务)
1、建立连接、开启事务(准备工作)
2、进行sql操作(业务逻辑)
3、执行成功,则commit;
执行失败,则rollback
总:Spring的事务是由aop来实现的,首先要生成具体的代理对象,然后按照aop的整套流程来执行具体的操作逻辑,通过通知来完成核心功能,但是事务不是通过通知来实现的,而是通过一个TransactionInteceptor来实现的,然后调用invoke来实现具体的逻辑
分:1、先做准备工作,解析各个方法上事务相关的属性(隔离性、传播特性),根据具体的属性来判断是否开启新事物
2、当需要开启的时候,获取数据库连接,关闭自动提交功能,开启事务
3、执行具体的sql逻辑操作
4、在操作过程中,如果执行失败了,那么会通过completeTransactionAfterThrowing来完成事务的回滚操作,回滚的具体逻辑是通过doRollBack来实现的,实现的时候也要获取连接对象,通过连接对象来回滚
protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) {// 判断当前是否存在事务if (txInfo != null && txInfo.hasTransaction()) {if (logger.isTraceEnabled()) {logger.trace("Completing transaction for [" + txInfo.getJoinpointIdentification() +"] after exception: " + ex);}// 判断是否满足回滚条件if (txInfo.transactionAttribute.rollbackOn(ex)) {try {// 回滚处理txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());}// 其余代码}else {try {// 如果不满足回滚条件出现异常也会继续提交txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());}// 其余代码}}
}
回滚操作,获取当前线程的数据库连接并调用其rollback方法进行回滚,使用的是底层数据库protected void doRollback(DefaultTransactionStatus status) {DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction();// 获取数据库连接Connection con = txObject.getConnectionHolder().getConnection();if (status.isDebug()) {logger.debug("Rolling back JDBC transaction on Connection [" + con + "]");}try {// 调用数据库的回滚con.rollback();}catch (SQLException ex) {throw new TransactionSystemException("Could not roll back JDBC transaction", ex);}
}
5、如果执行过程中,没有任何意外情况的发生,那么通过completeTransactionAfterReturning来完成事务的提交操作,提交的具体逻辑是通过doCommit方法来实现的,实现的时候也是要获取链接,通过连接对象来提交
6、当事务执行完毕之后需要清除相关的事务信息cleanupTransactionInfo