本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第3章,第3.7节将安全的副作用引入STM中,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看
3.7 将安全的副作用引入STM中
STM的副作用并不安全。原因是dosync块很可能会被重试不止一次,无论副作用是正常的还是不当的,都会被一次又一次地执行。值会被多次写到屏幕或日志文件上。更糟的是,值被多次写入数据库。
然而,所有的程序都会产生一些副作用。控制复杂度的同时会引入副作用。最简单的办法是将副作用控制在事务外部。
本方法中,为了演示过程,这里将模拟进程饥饿(thread starvation)。这听起来很严重。但它仅意味着有一个进程无法获得其所需资源,因此它无法完成工作。这里将使用atom(一个不由STM控制的引用)来记录STM重试调用agent的次数。这样一来,可以知道产生问题的原因和解决方法。