当前位置: 首页 > news >正文

Apache Ignite 中事务的使用方式和机制

这段内容讲的是 Apache Ignite 中事务的使用方式和机制,包括如何启用事务、执行事务、并发模式(Concurrency Mode)和隔离级别(Isolation Level)等。下面我用中文详细解释这段内容,帮助你更好地理解。


一、事务概述(Overview)

1. 启用事务支持

要在一个缓存中使用事务,必须在配置中将缓存的 原子性模式(atomicityMode) 设置为 TRANSACTIONAL

CacheConfiguration<Integer, String> cfg = new CacheConfiguration<>("myCache");
cfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
  • 只有设置为 TRANSACTIONAL 模式后,缓存才支持事务操作。
  • 如果设置为 ATOMIC(默认),则不支持事务。

🔍 参考: Atomicity Mode(原子性模式) 决定了缓存是支持原子操作(ATOMIC)还是事务操作(TRANSACTIONAL)。


二、事务的执行(Executing Transactions)

Ignite 提供了基于 Key-Value API 的事务接口,可以让你手动控制事务的开始、提交和回滚。

示例代码:

Ignite ignite = Ignition.ignite();
IgniteCache<String, Integer> cache = ignite.cache("myCache");
IgniteTransactions transactions = ignite.transactions();try (Transaction tx = transactions.txStart()) {Integer hello = cache.get("Hello");if (hello == 1)cache.put("Hello", 11);cache.put("World", 22);tx.commit(); // 提交事务
}

说明:

  • 使用 transactions.txStart() 启动一个事务。
  • 所有在事务中的操作(如 getput)都会被当作一个整体。
  • 最后调用 tx.commit() 提交事务。如果发生异常,可以调用 tx.rollback() 回滚。
  • 事务是 原子性的:要么全部成功,要么全部失败,不会出现部分更新。

三、并发模式(Concurrency Modes)

事务支持两种并发模式:

并发模式描述
OPTIMISTIC(乐观)在事务提交时检查是否有冲突。适用于并发冲突较少的场景。
PESSIMISTIC(悲观)在事务访问数据时立即加锁,防止其他事务修改。适用于并发冲突较多的场景。

锁的获取时机:

  • OPTIMISTIC:在事务提交时检查冲突,不提前加锁。
  • PESSIMISTIC:在事务访问数据时就加锁,直到事务提交或回滚才释放。

⚠️ 注意: 如果使用 PESSIMISTIC 模式,事务会锁定相关数据,可能会影响拓扑变更(如添加/删除节点、销毁缓存等),详见之前的“拓扑变更限制”内容。


四、隔离级别(Isolation Levels)

隔离级别决定了多个事务之间如何相互“看到”彼此的操作。

Ignite 支持以下三种隔离级别:

隔离级别描述
READ_COMMITTED事务只能读取已经提交的数据。防止脏读。
REPEATABLE_READ事务在执行期间多次读取同一数据,结果保持一致。防止脏读和不可重复读。
SERIALIZABLE最严格的隔离级别。事务串行执行,防止脏读、不可重复读和幻读。

举例说明:

  • READ_COMMITTED:你读到的数据一定是其他事务已经提交的。
  • REPEATABLE_READ:你在事务中两次读同一个 key,结果是一样的。
  • SERIALIZABLE:所有事务串行执行,不会有并发问题,但性能最低。

五、并发模式 + 隔离级别的组合

Ignite 支持所有并发模式和隔离级别的组合,每种组合有不同的行为和一致性保证。

并发模式隔离级别行为特点
OPTIMISTICREAD_COMMITTED提交时检查冲突,只允许读已提交的数据
OPTIMISTICREPEATABLE_READ提交时检查冲突,保证事务中多次读相同数据一致
OPTIMISTICSERIALIZABLE提交时检查冲突,事务串行化执行
PESSIMISTICREAD_COMMITTED访问数据时加锁,只允许读已提交的数据
PESSIMISTICREPEATABLE_READ访问数据时加锁,保证多次读相同数据一致
PESSIMISTICSERIALIZABLE访问数据时加锁,事务串行执行

六、事务配置(Transaction Configuration)

你可以在 IgniteConfiguration 中对事务进行一些全局配置,比如设置事务超时时间:

<bean class="org.apache.ignite.configuration.IgniteConfiguration"><property name="transactionConfiguration"><bean class="org.apache.ignite.configuration.TransactionConfiguration"><!-- 设置事务在拓扑变更时的最大等待时间为20秒 --><property name="txTimeoutOnPartitionMapExchange" value="20000"/></bean></property>
</bean>

这个配置用于控制事务在分区映射交换(Partition Map Exchange)期间等待的最长时间。


七、总结表格

概念说明
原子性模式设置为 TRANSACTIONAL 才能使用事务
事务执行使用 txStart() 开启事务,commit() 提交,rollback() 回滚
并发模式OPTIMISTIC(乐观)和 PESSIMISTIC(悲观)
隔离级别READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE
锁机制PESSIMISTIC 会立即加锁,OPTIMISTIC 在提交时检查冲突
拓扑限制PESSIMISTIC 事务期间不能修改缓存拓扑
配置可设置事务超时时间等参数

✅ 建议做法:

  • 尽量避免长时间持有事务,尤其是 PESSIMISTIC 模式
  • 如果并发冲突少,可以使用 OPTIMISTIC + READ_COMMITTED,性能更好。
  • 如果数据一致性要求高,可以使用 PESSIMISTIC + REPEATABLE_READ
  • 事务中尽量减少操作的数据量和时间,避免影响集群拓扑变更。

如果你在开发中需要保证多个缓存操作的原子性和一致性,Ignite 的事务机制是一个非常有用的工具。理解并发模式和隔离级别的区别,有助于你根据业务需求选择合适的事务配置。

http://www.dtcms.com/a/291829.html

相关文章:

  • 短剧小程序系统开发:重塑影视内容传播格局
  • LIMO:仅需817样本激活大模型数学推理能力,挑战“数据规模至上”传统范式
  • Axios 二次封装
  • PHP中的异常处理与自定义错误页面
  • EasyGBS算法仓:找算法,变成 “点一下” 的事!
  • 使用 Conda 工具链创建 UV 本地虚拟环境全记录——基于《Python 多版本与开发环境治理架构设计》
  • Docker实战:使用Docker部署TeamMapper思维导图工具
  • 推送git问题_查询索引文件——查导致的文件
  • 按键精灵脚本:自动化利刃的双面性 - 从技术原理到深度实践与反思
  • windows10安装node-v18.18.0-x64安装
  • async/await 函数
  • 【CVPR 2025】低光增强RT-X Net( 红外辅助结构引导)--part1论文精读
  • 开发者的AI认知指南:用大模型重新理解人工智能(下)
  • 公交车客流人数统计管理解决方案:智能化技术与高效运营实践
  • 九鼎X8390 开发板 联发科 MT8390 / MT8370 芯片平台
  • 华为高斯Gauss数据库版本与兼容协议--详解(附带Gorm连接示例代码)
  • 5G工业路由器如何凭借高性价比助力多行业数字化转型?
  • 2025 LCP用2,6酸市场前瞻:全面洞察与投资潜力预测
  • iOS组件化详解
  • Windows 环境下,使用 VirtualBox 安装 Ubuntu 虚拟机
  • 34、鸿蒙Harmony Next开发:使用动画-转场动画
  • JMeter groovy 编译成.jar 文件
  • RabbitMQ--批量处理
  • 【Zephyr开发实践系列】09_LittleFs文件系统操作
  • 在easyui中如何自定义表格里面的内容
  • 目标检测系列(六)labelstudio实现自动化标注
  • vue2 webpack 部署二级目录、根目录nginx配置及打包配置调整
  • 容器化部署 Tomcat + MySQL 实战指南:从入门到进阶
  • MongoDB数据库详解-针对大型分布式项目采用的原因以及基础原理和发展-卓伊凡|贝贝|莉莉
  • 架构演进核心路线:从离线仓库到实时湖仓一体