Spring原理篇(17)--Spring事务的传播机制;该篇章是Spring原理篇的最后一章;

throw new IllegalTransactionStateException(

“No existing transaction found for transaction marked with propagation ‘mandatory’”);

}

"如果 PROPAGATION_REQUIRED PROPAGATION_REQUIRES_NEW TransactionDefinition.PROPAGATION_NESTED "

“继续往下走.”

else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||

def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||

def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {

"如果有事务 挂起事务.贴合上面所描述 "

SuspendedResourcesHolder suspendedResources = suspend(null);

if (debugEnabled) {

logger.debug(“Creating new transaction with name [” + def.getName() + "]: " + def);

}

try {

" 核心方法 : 开启事务 "

return startTransaction(def, transaction, debugEnabled, suspendedResources);

}

catch (RuntimeException | Error ex) {

resume(null, suspendedResources);

throw ex;

}

}

…省略部分代码

}

}

startTransaction

============================================================================

private TransactionStatus startTransaction(TransactionDefinition definition, Object transaction,

boolean debugEnabled, @Nullable SuspendedResourcesHolder suspendedResources) {

boolean newSynchronization = (getTransactionSynchronization() != SYNCHRONIZATION_NEVER);

DefaultTransactionStatus status = newTransactionStatus(

definition, transaction, true, newSynchronization, debugEnabled, suspendedResources);

“开启事务 看用了什么组件;”

doBegin(transaction, definition);

prepareSynchronization(status, definition);

return status;

}

在这里插入图片描述

这里 我们用了DataSource

@Override

protected void doBegin(Object transaction, TransactionDefinition definition) {

DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;

“申明数据库连接”

Connection con = null;

try {

if (!txObject.hasConnectionHolder() ||

txObject.getConnectionHolder().isSynchronizedWithTransaction()) {

Connection newCon = obtainDataSource().getConnection();

if (logger.isDebugEnabled()) {

logger.debug(“Acquired Connection [” + newCon + “] for JDBC transaction”);

}

txObject.setConnectionHolder(new ConnectionHolder(newCon), true);

}

txObject.getConnectionHolder().setSynchronizedWithTransaction(true);

con = txObject.getConnectionHolder().getConnection();

“设置隔离级别”

Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition);

txObject.setPreviousIsolationLevel(previousIsolationLevel);

“设置事务是否可读”

txObject.setReadOnly(definition.isReadOnly());

if (con.getAutoCommit()) {

txObject.setMustRestoreAutoCommit(true);

if (logger.isDebugEnabled()) {

logger.debug(“Switching JDBC Connection [” + con + “] to manual commit”);

}

“关闭事务自动提交!”

con.setAutoCommit(false);

}

}

上面那一段源码 匹配上这段文字了

在这里插入图片描述

主要是设置autoCommit 为false;

接下来 我们看这个方法

再我们的

private TransactionStatus handleExistingTransaction(

TransactionDefinition definition, Object transaction, boolean debugEnabled)

throws TransactionException {

“如果是never 就报错 不支持当前有事务 后面会写进去总结里面”

if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NEVER) {

throw new IllegalTransactionStateException(

“Existing transaction found for transaction marked with propagation ‘never’”);

}

"NOT_SUPPORTED 意思是不开启新的数据库连接. "

"我们的事务 实际就是一个一个的数据库连接;我们有两个步骤 一个是先挂起 然后开启新的事务 "

" 这个就是说 我挂起. 但是不开启新的事务;"

“那后面的那个数据库连接 实际上用的就是Jdbc 或者是 Mybatis里面的数据库连接了”

if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NOT_SUPPORTED) {

if (debugEnabled) {

logger.debug(“Suspending current transaction”);

}

Object suspendedResources = suspend(transaction);

boolean newSynchronization = (getTransactionSynchronization() == SYNCHRONIZATION_ALWAYS);

return prepareTransactionStatus(

definition, null, false, newSynchronization, debugEnabled, suspendedResources);

}

“REQUIRES_NEW 开启一个新的事务 也就是开启一个新的数据库连接”

if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {

if (debugEnabled) {

logger.debug(“Suspending current transaction, creating new transaction with name [” +

definition.getName() + “]”);

}

SuspendedResourcesHolder suspendedResources = suspend(transaction);

try {

return startTransaction(definition, transaction, debugEnabled, suspendedResources);

}

catch (RuntimeException | Error beginEx) {

resumeAfterBeginException(transaction, suspendedResources, beginEx);

throw beginEx;

}

}

“PROPAGATION_NESTED 不会去开启新的数据库连接 再数据库里 有一个savepoint的一个说法”

“也就是设置了这个savepoint 我们可以回滚到 某一个点上 例如 我执行A B C 3个sql”

“再B sql 上面我们创建了 savepoint 那么 就会回滚到B sql 这里来;”

if (definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED) {

if (!isNestedTransactionAllowed()) {

throw new NestedTransactionNotSupportedException(

"Transaction manager does not allow nested transactions by default - " +

“specify ‘nestedTransactionAllowed’ property with value ‘true’”);

}

if (debugEnabled) {

logger.debug(“Creating nested transaction with name [” + definition.getName() + “]”);

}

if (useSavepointForNestedTransaction()) {

// Create savepoint within existing Spring-managed transaction,

// through the SavepointManager API implemented by TransactionStatus.

// Usually uses JDBC 3.0 savepoints. Never activates Spring synchronization.

DefaultTransactionStatus status =

prepareTransactionStatus(definition, transaction, false, false, debugEnabled, null);

status.createAndHoldSavepoint();

return status;

}

else {

// Nested transaction through nested begin and commit/rollback calls.

// Usually only for JTA: Spring synchronization might get activated here

// in case of a pre-existing JTA transaction.

return startTransaction(definition, transaction, debugEnabled, null);

}

}

// Assumably PROPAGATION_SUPPORTS or PROPAGATION_REQUIRED.

if (debugEnabled) {

logger.debug(“Participating in existing transaction”);

}

if (isValidateExistingTransaction()) {

if (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT) {

Integer currentIsolationLevel = TransactionSynchronizationManager.getCurrentTransactionIsolationLevel();

if (currentIsolationLevel == null || currentIsolationLevel != definition.getIsolationLevel()) {

Constants isoConstants = DefaultTransactionDefinition.constants;

throw new IllegalTransactionStateException(“Participating transaction with definition [” +

definition + "] specifies isolation level which is incompatible with existing transaction: " +

(currentIsolationLevel != null ?

isoConstants.toCode(currentIsolationLevel, DefaultTransactionDefinition.PREFIX_ISOLATION) :

“(unknown)”));

}

}

if (!definition.isReadOnly()) {

if (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) {

throw new IllegalTransactionStateException(“Participating transaction with definition [” +

definition + “] is not marked as read-only but existing transaction is”);

}

}

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

Java程序员秋招三面蚂蚁金服,我总结了所有面试题,也不过如此

同时减轻大家的负担。**
[外链图片转存中…(img-7QWXyynF-1711007353303)]
[外链图片转存中…(img-mx6H77Fh-1711007353304)]
[外链图片转存中…(img-J7Sc77MM-1711007353305)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-kluokMqR-1711007353305)]

写在最后

为了这次面试,也收集了很多的面试题!

以下是部分面试题截图

[外链图片转存中…(img-mPcdz7Xr-1711007353306)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值