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() 方法创建新的事务对象,主要步骤包括:
- 获取当前任务的哈希值用于跟踪
- 创建 GridNearTxLocal 实例
- 设置事务属性,如并发模式、隔离级别、超时时间等
- 为系统事务设置拓扑版本以防止死锁
2.5 事务初始化
在 GridNearTxLocal 构造函数中,会进行以下初始化操作:
- 调用父类构造函数初始化基本属性
- 生成事务版本号,通过 GridCacheVersionManager.next() 方法生成全局唯一的版本号
- 初始化事务映射表,用于记录事务涉及的节点和键值映射关系
- 初始化事务结果对象
2.6 事务注册
通过 IgniteTxManager.onCreated() 方法将新创建的事务注册到事务管理器中:
- 检查事务是否已完成,如果已完成则直接返回 null
- 将事务添加到事务映射表中
- 对于非隐式事务,将其添加到线程映射表中,以便后续通过线程 ID 查找事务
- 记录事务开始事件
2.7 事务代理创建
最后通过 GridNearTxLocal.proxy() 方法创建事务代理对象 TransactionProxyImpl,用户后续对事务的操作都是通过这个代理对象进行。
3. 事务版本号机制
Ignite 使用 GridCacheVersion 来唯一标识每个事务,版本号包含以下信息:
- topVer: 拓扑版本号,表示事务创建时的集群拓扑状态
- order: 事务顺序号,保证全局顺序
- nodeOrder: 节点顺序号,标识事务发起节点
通过这种机制,Ignite 能够处理分布式环境下的事务冲突检测和一致性保证。
4. 事务映射机制
在分布式事务中,Ignite 需要跟踪事务涉及的所有键值对以及它们所在的节点。IgniteTxMappingsImpl 和 IgniteTxMappingsSingleImpl 用于维护这种映射关系,确保事务能够正确地在涉及的节点间协调。
生成版本号
- 生成唯一版本号
在 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 能够在保证性能的同时提供强一致性保证。
事务开启的关键点:
- 线程安全: 通过读写锁确保并发访问的安全性
- 状态检查: 验证集群状态和线程事务状态
- 版本管理: 为每个事务分配唯一版本号用于冲突检测
- 拓扑感知: 考虑集群拓扑变化对事务的影响
- 追踪支持: 提供分布式追踪能力便于问题诊断
Ignite 的事务机制设计体现了分布式系统中复杂性管理的精髓,通过分层架构和职责分离,将复杂的分布式事务处理封装成简单易用的 API,同时保证了系统的可靠性和性能。