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

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

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

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

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

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

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

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

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

注意:

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

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

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

POM相关依赖包如下:

pom依赖包


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

你可能感兴趣的:(Akka框架之软件事务内存 (STM))