Apache Ignite 开启事务执行流程

作用

总体流程

1
2
3
4
5
6
7
8
9
10
获取 Ignite 实例
获取 Ignite Transaction 对象
加读写锁以确保当前线程只有一个事务
开启事务
初始化近程事务 GridNearTxLocal
初始化事务状态,设置事务版本、拓扑信息、映射等
获取版本管理器
获取拓扑版本
生成下一个版本号
返回事务代理供用户操作

详细流程

获取ignite实例

这一步获取 Ignite 集群的入口点实例,用于后续操作。Ignition 类是静态工厂方法,内部通过 IgnitionEx 获取实际的网格实例,并根据安全配置决定是否包装为代理对象。

1
2
3
4
5
6
7
org.apache.ignite.Ignition#ignite 获取ignite实例
org.apache.ignite.internal.IgnitionEx#grid 获取网格实例
org.apache.ignite.internal.IgnitionEx#grid 获取网格实例
org.apache.ignite.internal.IgnitionEx.IgniteNamedInstance#grid 获取命名网格实例
org.apache.ignite.Ignition#wrapToProxyIfNeeded 如需要则包装为代理
org.apache.ignite.internal.processors.security.SecurityUtils#isInsideSandbox 检查是否在沙箱内
org.apache.ignite.internal.processors.security.IgniteSecurityProcessor#hasSandboxedNodes 检查是否有沙箱节点

获取Ignite Transaction 对象

这一步通过内核上下文获取事务管理器。首先检查集群状态确保集群处于活动状态,然后获取缓存处理器中的事务管理器。使用读锁保护线程安全,防止并发访问导致的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
org.apache.ignite.internal.IgniteKernal#transactions 获取 Ignite Transaction 对象
org.apache.ignite.internal.IgniteKernal#guard 加读锁保护线程安全
org.apache.ignite.internal.GridKernalContextImpl#gateway 获取网关
org.apache.ignite.internal.GridKernalGatewayImpl#readLock 加读锁,断言状态是started
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#readLock 读写锁
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#curIdx 获取当前索引
org.apache.ignite.internal.IgniteKernal#checkClusterState 校验集群状态
org.apache.ignite.internal.GridKernalContextImpl#state 获取状态
org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor#publicApiActiveState 公共API活动状态
org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor#publicApiActiveStateAsync 异步获取公共API活动状态
org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor#publicApiStateAsync 异步获取公共API状态
org.apache.ignite.internal.processors.cluster.DiscoveryDataClusterState#transition 状态转换
org.apache.ignite.internal.processors.cluster.DiscoveryDataClusterState#state 获取状态
org.apache.ignite.internal.util.future.IgniteFinishedFutureImpl#init0 初始化完成的Future
org.apache.ignite.internal.util.future.GridFinishedFuture#init0 初始化完成的Future
org.apache.ignite.internal.util.future.IgniteFutureImpl#init0 初始化Future
org.apache.ignite.internal.util.future.IgniteFutureImpl#init0 初始化Future
org.apache.ignite.internal.util.future.IgniteFutureImpl#chain 链式操作Future
org.apache.ignite.internal.util.future.IgniteFutureImpl#chainInternal 内部链式操作Future
org.apache.ignite.internal.util.future.GridFinishedFuture#chain 链式操作完成的Future
org.apache.ignite.internal.util.future.IgniteFutureImpl#get 获取Future结果
org.apache.ignite.internal.util.future.GridFinishedFuture#get 获取完成Future的结果
org.apache.ignite.cluster.ClusterState#active 集群是否活动
org.apache.ignite.internal.util.future.GridFinishedFuture#init0 初始化完成的Future
org.apache.ignite.internal.util.future.IgniteFutureImpl#init0 初始化Future
org.apache.ignite.internal.util.future.IgniteFutureImpl#get 获取Future结果
org.apache.ignite.internal.util.future.GridFinishedFuture#get 获取完成Future的结果
org.apache.ignite.internal.GridKernalContextImpl#cache 获取缓存处理器
org.apache.ignite.internal.processors.cache.GridCacheProcessor#transactions 获取事务管理器
org.apache.ignite.internal.IgniteKernal#unguard 解除保护模式
org.apache.ignite.internal.GridKernalContextImpl#gateway 获取网关
org.apache.ignite.internal.GridKernalGatewayImpl#readUnlock 解读锁
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#readLock 读写锁
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#curIdx 获取当前索引

开启事务

这一步是事务开启的核心过程。首先检查当前线程是否已有事务(Ignite 不支持嵌套事务),然后创建新的 GridNearTxLocal 事务对象。事务初始化包括生成唯一版本号、设置拓扑信息、初始化状态和映射等。最后返回事务代理对象供用户使用,整个过程通过读锁保证线程安全,并支持分布式追踪。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
org.apache.ignite.internal.processors.cache.transactions.IgniteTransactionsImpl#txStart 开启事务
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#kernalContext 获取内核上下文
org.apache.ignite.internal.GridKernalContextImpl#config 获取配置
org.apache.ignite.internal.processors.cache.GridCacheUtils#transactionConfiguration 获取事务配置
org.apache.ignite.configuration.IgniteConfiguration#getTransactionConfiguration 获取事务配置
org.apache.ignite.configuration.TransactionConfiguration#getDefaultTxTimeout 获取默认事务超时时间
org.apache.ignite.internal.processors.cache.transactions.IgniteTransactionsImpl#txStart0 开启事务,返回事务代理对象
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#kernalContext 获取内核上下文
org.apache.ignite.internal.GridKernalContextImpl#gateway 获取网关
org.apache.ignite.internal.GridKernalGatewayImpl#readLock 加读锁,保证线程安全
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#readLock 读写锁
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#curIdx 获取当前索引
org.apache.ignite.internal.GridKernalContextImpl#tracing 获取追踪管理器
org.apache.ignite.internal.managers.tracing.GridTracingManager#create 创建追踪
org.apache.ignite.internal.processors.tracing.MTC#supportInitial 支持初始追踪
org.apache.ignite.internal.processors.tracing.NoopSpan#addTag 添加标签
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#tm 获取事务管理器
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#userTx 检查当前线程是否存在事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#tx 根据当前线程查找事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#activeUserTx 检查当前线程是否存在事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#newTx 创建新事务
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#kernalContext 获取内核上下文
org.apache.ignite.internal.GridKernalContextImpl#job 获取作业处理器
org.apache.ignite.internal.processors.job.GridJobProcessor#currentTaskNameHash 获取当前任务名哈希值
org.apache.ignite.internal.processors.job.GridJobProcessor#currentTaskName 获取当前任务名
org.apache.ignite.internal.GridKernalContextImpl#security 获取安全处理器
org.apache.ignite.internal.processors.security.NoOpIgniteSecurityProcessor#enabled 安全是否启用
org.apache.ignite.internal.processors.security.SecurityUtils#securitySubjectId 获取安全主体ID
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#kernalContext 获取内核上下文
org.apache.ignite.internal.processors.security.SecurityUtils#securitySubjectId 获取安全主体ID
org.apache.ignite.internal.GridKernalContextImpl#security 获取安全处理器
org.apache.ignite.internal.processors.security.NoOpIgniteSecurityProcessor#enabled 安全是否启用
org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal#init0 初始化近程事务
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#versions 获取版本管理器
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#kernalContext 获取内核上下文
org.apache.ignite.internal.GridKernalContextImpl#discovery 获取发现管理器
org.apache.ignite.internal.managers.discovery.GridDiscoveryManager#topologyVersion 获取拓扑版本
org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion#topologyVersion 获取拓扑版本号
org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager#next 生成下一个版本号
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#localNode 获取本地节点
org.apache.ignite.internal.GridKernalContextImpl#discovery 获取发现管理器
org.apache.ignite.internal.managers.discovery.GridDiscoveryManager#localNode 获取本地节点
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode#order 获取节点顺序
org.apache.ignite.internal.processors.cache.version.GridCacheVersionManager#next 生成下一个版本号
org.apache.ignite.internal.processors.cache.version.GridCacheVersion#init0 初始化版本
org.apache.ignite.internal.processors.metric.impl.AtomicLongMetric#value 获取指标值
org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtTxLocalAdapter#init0 初始化DHT本地事务适配器
org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter#init0 初始化本地事务适配器
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#init0 初始化事务适配器
org.apache.ignite.internal.util.lang.GridMetadataAwareAdapter#init0 初始化元数据感知适配器
org.apache.ignite.internal.util.IgniteUtils#currentTimeMillis 获取当前时间毫秒数
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#kernalContext 获取内核上下文
org.apache.ignite.internal.util.IgniteUtils#contextDeploymentClassLoaderId 获取上下文部署类加载器ID
org.apache.ignite.internal.GridKernalContextImpl#deploy 获取部署管理器
org.apache.ignite.internal.managers.deployment.GridDeploymentManager#enabled 部署管理器是否启用
org.apache.ignite.internal.managers.GridManagerAdapter#enabled 管理器是否启用
org.apache.ignite.internal.GridKernalContextImpl#job 获取作业处理器
org.apache.ignite.internal.processors.job.GridJobProcessor#currentDeployment 获取当前部署
org.apache.ignite.internal.GridKernalContextImpl#cache 获取缓存处理器
org.apache.ignite.internal.processors.cache.GridCacheProcessor#context 获取缓存上下文
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#deploy 获取部署管理器
org.apache.ignite.internal.processors.cache.GridCacheDeploymentManager#locLoaderId 获取本地加载器ID
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#discovery 获取发现管理器
org.apache.ignite.internal.GridKernalContextImpl#discovery 获取发现管理器
org.apache.ignite.internal.managers.discovery.GridDiscoveryManager#localNode 获取本地节点
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode#id 获取节点ID
org.apache.ignite.internal.managers.discovery.ConsistentIdMapper#init0 初始化一致ID映射器
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#gridEvents 获取事件管理器
org.apache.ignite.internal.GridKernalContextImpl#event 获取事件管理器
org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager#isRecordable 检查事件是否可记录
org.apache.ignite.internal.GridKernalContextImpl#task 获取任务处理器
org.apache.ignite.internal.processors.task.GridTaskProcessor#resolveTaskName 解析任务名
org.apache.ignite.internal.GridKernalContextImpl#performanceStatistics 获取性能统计处理器
org.apache.ignite.internal.processors.performancestatistics.PerformanceStatisticsProcessor#enabled 性能统计是否启用
org.apache.ignite.internal.processors.cache.transactions.IgniteTxStateImpl#init0 初始化事务状态实现
org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalStateAdapter#init0 初始化本地事务状态适配器
org.apache.ignite.internal.util.GridIntList#init0 初始化整数列表
org.apache.ignite.internal.processors.cache.distributed.near.IgniteTxMappingsImpl#init0 初始化事务映射实现
org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter#initResult 初始化事务结果
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#localResult 获取本地结果
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#localNodeId 获取本地节点ID
org.apache.ignite.internal.GridKernalContextImpl#localNodeId 获取本地节点ID
org.apache.ignite.internal.GridKernalContextImpl#localNode 获取本地节点
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode#id 获取节点ID
org.apache.ignite.internal.processors.cache.transactions.IgniteTxLocalAdapter#originatingNodeId 获取发起节点ID
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#localNodeId 获取本地节点ID
org.apache.ignite.internal.GridKernalContextImpl#localNodeId 获取本地节点ID
org.apache.ignite.internal.GridKernalContextImpl#localNode 获取本地节点
org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode#id 获取节点ID
org.apache.ignite.internal.processors.cache.GridCacheReturn#init0 初始化缓存返回值
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#timeout 设置事务超时时间
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#system 是否为系统事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#applicationAttributes 设置应用属性
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#onCreated 事务创建回调
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#transactionMap 获取事务映射
org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal#near 是否为近程事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#local 是否为本地事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#resetContext 重置事务上下文
org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager#isCompleted 检查事务是否已完成
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#xidVersion 获取事务ID版本
org.apache.ignite.internal.processors.cache.version.GridCacheVersion#hashCode 获取哈希码
org.apache.ignite.internal.processors.cache.version.GridCacheVersion#nodeOrder 获取节点顺序
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#local 是否为本地事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#dht 是否为DHT事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#xidVersion 获取事务ID版本
org.apache.ignite.internal.processors.cache.version.GridCacheVersion#hashCode 获取哈希码
org.apache.ignite.internal.processors.cache.version.GridCacheVersion#nodeOrder 获取节点顺序
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#local 是否为本地事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#dht 是否为DHT事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#implicit 是否为隐式事务
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#threadId 获取线程ID
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#recordStateChangedEvent 记录事务状态变更事件
org.apache.ignite.internal.processors.cache.GridCacheSharedContext#gridEvents 获取事件管理器
org.apache.ignite.internal.GridKernalContextImpl#event 获取事件管理器
org.apache.ignite.internal.processors.cache.transactions.IgniteTxAdapter#system 是否为系统事务
org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager#isRecordable 检查事件是否可记录
org.apache.ignite.internal.GridLoggerProxy#isDebugEnabled 是否启用调试日志
org.apache.ignite.logger.log4j2.Log4J2Logger#isDebugEnabled 是否启用调试日志
org.apache.ignite.internal.GridKernalGatewayImpl#readUnlock 解读锁
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#readLock 读写锁
org.apache.ignite.internal.util.StripedCompositeReadWriteLock#curIdx 获取当前索引
org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal#proxy 创建事务代理
org.apache.ignite.internal.processors.cache.transactions.TransactionProxyImpl#init0 初始化事务代理

事务开启原理深入分析

1. 事务管理器的设计

Ignite 中的事务管理采用分层设计,主要涉及以下几个核心组件:

  • IgniteTransactionsImpl: 事务管理器的实现类,对外提供事务操作接口
  • IgniteTxManager: 内部事务管理器,负责事务的创建、维护和销毁
  • GridNearTxLocal: 近端事务的具体实现,代表用户直接交互的事务对象
  • TransactionProxyImpl: 面向用户的事务代理对象

2. 事务创建过程详解

事务的创建过程涉及多个关键步骤:

2.1 参数校验与配置

IgniteTransactionsImpl#txStart0 方法中,首先会对传入的参数进行校验,包括并发模式、隔离级别等。如果未指定参数,则使用默认配置。

2.2 线程安全控制

GridKernalGatewayImpl#readLock 加读锁来保证线程安全,防止在事务创建过程中集群状态发生变化。

2.3 嵌套事务检查

在创建新事务之前,会通过 IgniteTxManager.userTx 检查当前线程是否已经存在事务。如果存在,则抛出异常,因为 Ignite 不支持嵌套事务。

2.4 事务对象创建

通过 IgniteTxManager.newTx() 方法创建新的事务对象,主要步骤包括:

  1. 获取当前任务的哈希值用于跟踪
  2. 创建 GridNearTxLocal 实例
  3. 设置事务属性,如并发模式、隔离级别、超时时间等
  4. 为系统事务设置拓扑版本以防止死锁

2.5 事务初始化

在 GridNearTxLocal 构造函数中,会进行以下初始化操作:

  1. 调用父类构造函数初始化基本属性
  2. 生成事务版本号,通过 GridCacheVersionManager.next() 方法生成全局唯一的版本号
  3. 初始化事务映射表,用于记录事务涉及的节点和键值映射关系
  4. 初始化事务结果对象

2.6 事务注册

通过 IgniteTxManager.onCreated() 方法将新创建的事务注册到事务管理器中:

  1. 检查事务是否已完成,如果已完成则直接返回 null
  2. 将事务添加到事务映射表中
  3. 对于非隐式事务,将其添加到线程映射表中,以便后续通过线程 ID 查找事务
  4. 记录事务开始事件

2.7 事务代理创建

最后通过 GridNearTxLocal.proxy() 方法创建事务代理对象 TransactionProxyImpl,用户后续对事务的操作都是通过这个代理对象进行。

3. 事务版本号机制

Ignite 使用 GridCacheVersion 来唯一标识每个事务,版本号包含以下信息:

  • topVer: 拓扑版本号,表示事务创建时的集群拓扑状态
  • order: 事务顺序号,保证全局顺序
  • nodeOrder: 节点顺序号,标识事务发起节点

通过这种机制,Ignite 能够处理分布式环境下的事务冲突检测和一致性保证。

4. 事务映射机制

在分布式事务中,Ignite 需要跟踪事务涉及的所有键值对以及它们所在的节点。IgniteTxMappingsImpl 和 IgniteTxMappingsSingleImpl 用于维护这种映射关系,确保事务能够正确地在涉及的节点间协调。

生成版本号

  1. 生成唯一版本号
    在 Apache Ignite 中,每个事务都有一个全局唯一的版本号(GridCacheVersion),这是事务管理的核心机制之一。当创建事务时,通过 GridCacheVersionManager.next() 方法生成版本号。

作用与原理:

  • 全局唯一标识:版本号由三部分组成:topologyVersion(拓扑版本)、order(顺序号)和 nodeOrder(节点顺序号)。这确保在分布式环境中每个事务都有唯一标识,避免事务 ID 冲突。

  • 事务顺序保证:order 字段是一个全局递增的序列号,保证事务在集群中的全局顺序。这是实现分布式事务 ACID 特性中“隔离性”的关键。

  • 冲突检测基础:在乐观事务中,通过比较版本号检测并发修改冲突。例如,当两个事务同时修改同一数据时,后提交的事务会检测到版本号不匹配而回滚。

  • 分布式协调依据:在两阶段提交过程中,各节点通过版本号识别对应的事务,作为事务提交/回滚消息的唯一标识。

  • 实现机制:GridCacheVersionManager 维护一个原子计数器,结合当前拓扑版本和节点 ID 生成全局唯一版本号。通过 CAS 操作确保递增序列的原子性。

设置拓扑信息

事务在创建时会记录当前集群的拓扑信息:

1
tx.topologyVersion(cctx.kernalContext().discovery().topologyVersion());

作用与原理:

  • 一致性视图保证:记录事务开始时的集群拓扑状态,确保事务在执行过程中看到一致的数据分布视图,避免因节点加入/离开导致的数据不一致问题。

  • 防止脏读和不可重复读:事务只能看到在该拓扑版本之前已提交的数据,即使集群拓扑发生变化,事务仍能保持其一致性视图。

  • 拓扑变更处理:如果事务执行过程中拓扑发生变化,Ignite 会检测并采取适当措施。对于悲观事务,可能直接失败;对于乐观事务,可能在提交时检测冲突。

  • 死锁预防:系统事务(如索引重建)会使用拓扑版本防止死锁,通过 lockedTopologyVersion() 获取已锁定的拓扑版本。

  • 实现细节:拓扑版本包含主版本号(topologyVersion)和次版本号(minorTopologyVersion)。主版本号在节点加入/离开时递增,次版本号在分区映射变更时递增。

初始化状态

事务状态(TransactionState)的初始化是事务管理的核心:

1
2
// 初始化事务状态
txState = new IgniteTxStateImpl();

作用与原理:

  • 事务生命周期管理:定义了事务的完整生命周期:ACTIVE → PREPARING → PREPARED → COMMITTING → COMMITTED,或 ACTIVE → MARKED_ROLLBACK → ROLLING_BACK → ROLLED_BACK。确保事务只能按预定义路径转换状态。

  • 并发控制基础:不同状态对应不同的锁策略,例如,PREPARING 状态下获取锁,PREPARED 状态下释放锁,为不同隔离级别提供状态支持。

  • 故障恢复关键:事务状态持久化到 WAL(Write-Ahead Log)。节点故障后,可通过状态恢复事务,如 PREPARED 状态表示事务已准备好提交,可继续完成。

  • 两阶段提交支持:PREPARED 状态表示所有参与者已准备好提交,COMMITTING 状态表示提交正在进行中。状态机确保两阶段提交的正确执行。

  • 状态转换约束:严格的转换规则防止非法状态(如从 COMMITTED 回滚到 ACTIVE),每个状态转换都可能触发相应的事件和处理逻辑。

初始化映射

事务映射(IgniteTxMappings)记录了事务涉及的节点和数据关系:

1
mappings = implicitSingle ? new IgniteTxMappingsSingleImpl() : new IgniteTxMappingsImpl();

作用与原理:

  • 分布式事务协调:记录每个键值对映射到哪些节点(主节点和备份节点),确定参与事务的节点集合,为两阶段提交提供参与者列表。

  • 近程与远程事务区分:nearMap 记录近端缓存映射(客户端节点),dhtMap 记录分布式哈希表映射(数据节点),支持 Ignite 的客户端-服务器架构。

  • 锁管理基础:为每个涉及的键值对维护锁信息,记录哪些节点持有锁,哪些节点需要获取锁,支持死锁检测和预防。

  • 事务提交优化:一阶段提交:当所有数据在单个节点上时,直接提交;两阶段提交:当数据分布在多个节点时,使用两阶段提交协议。

  • 故障恢复依据:节点故障时,通过映射关系确定受影响的事务,为事务恢复提供必要的上下文信息,支持从故障中恢复事务状态。

相关类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
IgniteTxManager
ignite 事务管理器,管理缓存事务
处理事务的创建、提交、回滚、状态管理以及与分布式事务相关的各种操作
负责协调多节点间的事务一致性,确保ACID属性在分布式环境下的实现
管理事务映射、版本控制和并发控制

GridNearTxLocal
近程事务本地实现,代表客户端发起的事务
处理事务的本地协调,管理事务状态和参与的缓存操作
负责与远端节点的通信,协调分布式事务的执行

IgniteTransactionsImpl
IgniteTransactions 接口的实现类
提供事务开启、配置和管理的高层API
封装了事务创建的复杂逻辑,简化用户使用

TransactionProxyImpl
事务代理实现,为用户提供事务操作的代理接口
包装实际的事务对象,提供统一的操作接口
支持事务的提交、回滚和状态查询等操作

GridCacheSharedContext
缓存共享上下文,持有缓存相关的共享资源和配置
提供对事务管理器、版本管理器、事件管理器等的访问
是事务系统与缓存系统交互的桥梁

IgniteTxAdapter
事务适配器基类,提供事务的基本功能和状态管理
定义了事务的生命周期方法和状态转换逻辑
支持事务的元数据管理和事件记录

总结

Apache Ignite 的事务开启过程涉及多个组件的协同工作,从高层API到低层实现,形成了一个完整的分布式事务管理系统。通过精细的状态管理和版本控制,Ignite 能够在保证性能的同时提供强一致性保证。

事务开启的关键点:

  1. 线程安全: 通过读写锁确保并发访问的安全性
  2. 状态检查: 验证集群状态和线程事务状态
  3. 版本管理: 为每个事务分配唯一版本号用于冲突检测
  4. 拓扑感知: 考虑集群拓扑变化对事务的影响
  5. 追踪支持: 提供分布式追踪能力便于问题诊断

Ignite 的事务机制设计体现了分布式系统中复杂性管理的精髓,通过分层架构和职责分离,将复杂的分布式事务处理封装成简单易用的 API,同时保证了系统的可靠性和性能。