Совместное использование транзакций STM и базы данных - PullRequest
13 голосов
/ 20 ноября 2011

Я использую библиотеку STM на Haskell, и мне очень нравится возможность составлять транзакции и общая природа STM "вы не можете получить это неправильно".

По уважительной причине STM не разрешает действия ввода-вывода в транзакции. Нет способа повторить действие ввода-вывода. (вставьте ссылку на запуск ракеты здесь). С другой стороны, транзакции базы данных имеют некоторые гарантии атомарности, которые очень похожи. Есть ли приемлемый способ использовать два вместе?

Ответы [ 2 ]

11 голосов
/ 20 ноября 2011

Чередование разных видов транзакций в единую концепцию транзакций называется «усилением транзакций», и в настоящее время в STM на Haskell нет отличного способа сделать это.Однако есть способ создать действия, которые будут выполняться только при фиксации или только при повторных попытках: http://hackage.haskell.org/package/stm-io-hooks

Кроме того, вы можете попробовать проект twilight-stm, который предоставляет явные "сумерки"между окончанием транзакции и фактическим подтверждением.Насколько я знаю, предоставленный код является скорее эталонной реализацией, чем настроенной на производительность, однако: http://proglang.informatik.uni -freiburg.de / projects / twilight /

Тем не менее, в зависимости отв вашем приложении оно может оказаться достаточно быстрым для ваших целей.

5 голосов
/ 20 ноября 2011

Некоторая общая помощь от кого-то, кто мало занимался базами данных:

Технически вы можете использовать unsafeIOToSTM, поэтому, если вы гарантируете атомарность в результате действия ввода-вывода, которое модифицирует базу данных, все должно быть в порядке.,Просто напишите мост, который использует unsafeIOToSTM, а затем используйте этот мост в своем коде, чтобы избежать засорения вашего кода небезопасными вещами.

Вы также можете использовать STM (IO a), но это не всегда подходит вашимцель, например

do r <- atomically $ do ...
   r' <- r

или

do r <- join . atomically $ do ...

Где вы возвращаете запрос к базе данных для выполнения из STM.Это безопасно, но гораздо более ограничено, чем то, что вы делаете с mVar, и не может быть изменено из-за действия IO, которое вы возвращаете (что хорошо в отношении безопасности, поскольку сохраняет атомарность)

...