Akka框架之软件事务内存 (STM)

软件事务内存:它和数据库中的事务类似,具有隔离性、原子性和一致性。区别点是内存事务不具备持久性,因为内存数据不会保存下来。

Actors模型是基于独立程序的前提下,可以隔离更新状态,状态更新只能通过消息传递实现。Actors内部保持住状态,异步消息传递意味着没有可以提供给组件一致性的调用过程。对于交易系统,如银行账户存款和提款的操作过程是需要是原子的,这可能需要跨两个账户调用过程是一个原子过程,软件事务内存(STM)提供了答案。

在很多场景下,一个工作可能由多个Actor协助完成,在这种协助事务中,如果一个Actor处理失败,根据事务的原子性,其他Actor锁进行的操作必须要回滚,要么全部成功,要么全部失败,进而保持数据的正确性。

STM提供了并发访问共享内存的管理控制机制。 STM利用两个概念 - 乐观和交易来管理共享的并发控制。

Akka提供一个结构协调actor之间的事务称为coordinated.coordinated,它是用来定义事务边界在交易事务开始时,coordinated.coordinate的方法被用来增加所有成员将参加同一个事务上下文。

示例:公司给员工发工资业务,公司账户扣钱,员工账户加钱。

定义公司账户CompanyActor和员工账户EmployeeActor
main方法
运行结果

CompanyActor和EmployeeActor都加入到同一个协调事务Coordinated中,保证了各账户金额总是一致的,若转账操作失败时就会回滚。

注意:

\bullet scala-library的版本不要使用最新的2.13.0,否则会报异常:NoClassDefFoundError: scala/Serializable,此类并不存在,而在2.12.8版本中是存在的。

\bullet 另外akka的其他依赖包也要和lib版本保持一致,即2.12的大版本,否则又会报其他类不匹配的异常。

\bullet akka事务控制需要引入akka-transactor包。

POM相关依赖包如下:

pom依赖包


--参考文献《实战Java高并发程序设计》

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 摘要 也许您已经听说过Akka,一种用于建造可伸缩,弹性且高效应用程序的工具包,支持Java和Scala编程语言。...
    wolfwolfgod阅读 1,721评论 0 3
  • 持久化 当我们在集群系统中,一台机器向另一台机器发送一段数据,负责接收的机器在接收数据前突然宕机,就会造成数据丢失...
    mango_knight阅读 4,840评论 0 4
  • 传统的游戏服务器要么是单线程要么是多线程,过去几十年里CPU一直遵循摩尔定律发展,带来的结果是单核频率越来越高。而...
    JunChow520阅读 67,394评论 14 58
  • Java内存模型 在Java 5之前,Java内存模型(JMM)定义是有问题的。当多个线程访问共享内存时很可能得到...
    jiangmo阅读 490评论 0 0
  • 这篇文章主要介绍了Flink通过Akka实现的分布式通信。它第一次在0.9版本中出现。通过Akka,所有的远程程序...
    alvin_wang阅读 10,044评论 0 12

友情链接更多精彩内容