使用 unsafeIOToSTM 从数据库中读取是否安全?

Safe to use unsafeIOToSTM to read from database?

在这个伪代码块中:

atomically $ do
  if valueInLocalStorage key
      then readValueFromLocalStorage key
      else do
        value <- unsafeIOToSTM $ fetchValueFromDatabase key
        writeValueToLocalStorage key value

使用unsafeIOToSTM安全吗?文档说:

我建议从 STM 交易中 I/O 只是一个坏主意。

大概你想要的是避免两个线程同时进行数据库查找。我会做的是:

  • 查看该项目是否已在缓存中。如果是,我们就完成了。

  • 如果不是,用"I'm fetching this"标志标记它,提交STM事务,从数据库中获取它,然后做第二个STM事务将它插入到缓存(并删除标志)。

  • 如果该项目已被标记,retry 交易。这会阻塞调用线程,直到第一个线程从数据库中插入值。