你还不知道Spring之事务的滚回和提交原理,这篇文章带你走进源码级别的解读

  • 源码分析

这里使用的是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_REQUIREDPROPAGATION_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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值