【摘要】:在例11-8中,使用两个变量updates和count,count变量用于触发临界区代码的重新执行,被包裹在STM引用中,updates变量用于记录Agent的更新次数。定义了一个名为count的STM引用,用于触发写冲突,该冲突将会导致事务的重新执行。事实上在STM事务中的Agent事务是不能够解决Agent事务负担过重的问题的,为了解决这个问题,需要在不同线程中使用相互协作的atomic块,Akka中可以通过协作事务和transactor来处理,这部分内容将在稍后介绍。
更新数据与读取数据稍有不同,当在一个事务中使用Agent的时候,Agent的更新操作可能和预期的有所不同,因为更新数据时可能遇到邻区代码检测到冲突,当临界区检查到更新冲突的时候,不会向Agent中提交事务,因此即使临界区代码执行多次,Agent中的值只会更新一次。在例11-8中,使用两个变量updates和count,count变量用于触发临界区代码的重新执行,被包裹在STM引用中,updates变量用于记录Agent的更新次数。例11-8代码如下所示。
【例11-8】更新Agent事务中的数据示例。
在例11-8中,定义了一个名为updates的Agent事务,用于记录更新的次数。定义了一个名为count的STM引用,用于触发写冲突,该冲突将会导致事务的重新执行。atomic块将会执行至少两次,但是Agent事务只会更新一次,因为更新操作只有在事务成功提交的时候才会被发送出去。更新操作是在另外一个线程中进行的,如若有多个相同的事务提交,那么将会有多个更新操作发送到Agent事务中,可能会造成Agent事务负担过重。事实上在STM事务中的Agent事务是不能够解决Agent事务负担过重的问题的,为了解决这个问题,需要在不同线程中使用相互协作的atomic块,Akka中可以通过协作事务和transactor来处理,这部分内容将在稍后介绍。(www.daowen.com)
运行结果如图11-9所示。
图11-9 更新Agent事务中的数据
接下来将介绍Akka Actor中的事务。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
有关Scala语言基础与开发实战的文章