Некоторая общая помощь от кого-то, кто мало занимался базами данных:
Технически вы можете использовать unsafeIOToSTM
, поэтому, если вы гарантируете атомарность в результате действия ввода-вывода, которое модифицирует базу данных, все должно быть в порядке.,Просто напишите мост, который использует unsafeIOToSTM
, а затем используйте этот мост в своем коде, чтобы избежать засорения вашего кода небезопасными вещами.
Вы также можете использовать STM (IO a), но это не всегда подходит вашимцель, например
do r <- atomically $ do ...
r' <- r
или
do r <- join . atomically $ do ...
Где вы возвращаете запрос к базе данных для выполнения из STM.Это безопасно, но гораздо более ограничено, чем то, что вы делаете с mVar, и не может быть изменено из-за действия IO, которое вы возвращаете (что хорошо в отношении безопасности, поскольку сохраняет атомарность)