- 源码分析
这里使用的是JDBC的方式进行的数据库连接,那么getSavepointManager()
函数返回的是JdbcTransactionObjectSupport,也就是说上面函数会调用JdbcTransactionObjectSupport 中的 rollbackToSavepoint 方法。
接下来查看一下JdbcTransactionObjectSupport 中的 rollbackToSavepoint 方法。
- 看源码(
JdbcTransactionObjectSupport.java
)
@Override
public void rollbackToSavepoint(Object savepoint) throws TransactionException {
ConnectionHolder conHolder = getConnectionHolderForSavepoint();
try {
conHolder.getConnection().rollback((Savepoint) savepoint);
conHolder.resetRollbackOnly();
}
catch (Throwable ex) {
throw new TransactionSystemException(“Could not roll back to JDBC savepoint”, ex);
}
}
当之前已经保存的事务信息中的事务为新事务,那么直接回滚。常用于单独事务的处理。对于没有保存点的回滚,Spring同样是使用底层数据库连接提供的API来操作的。由于我们使用的是DataSourceTransactionManager
,所以AbstractPlatformTransactionManager
里的processRollback
函数里的doRollback(status);
也就是在DataSourceTransactionManager实现的。
- 看源码(
DataSourceTransactionManager.java
)
@Override
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 translateException(“JDBC rollback”, ex);
}
}
当前事务信息中表明是存在事务的,又不属于以上两种情况,只做回滚标识,等到提交的时候再判断是否又回滚标识,下面回滚的时候再介绍,子事务中状态为PROPAGATION_SUPPORTS 或PROPAGATION_REQUIRED或PROPAGATION_MANDATORY回滚的时候将会标记为回滚标识,我们先来看看是怎么标记的。回到AbstractPlatformTransactionManager
类的processRollback
函数的doSetRollbackOnly(status);
- 看源码(
DataSourceTransactionManager.java
)
@Override
protected void doSetRollbackOnly(DefaultTransactionStatus status) {
// 将status中的transaction取出
DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction();
if (status.isDebug()) {
logger.debug(“Setting JDBC transaction [” + txObject.getConnectionHolder().getConnection() +
“] rollback-only”);
}
// transaction执行标记回滚
txObject.setRollbackOnly();
}
继续查看一下setRollbackOnly()
函数:
- 看源码(
DataSourceTransactionManager.java
)
public void setRollbackOnly() {
// 这里将transaction里面的connHolder标记回滚
getConnectionHolder().setRollbackOnly();
}
继续查看setRollbackOnly()的具体实现
- 看源码(
ResourceHolderSupport.java