Я хотел бы выполнить некоторую атомарность методов с Ruby, согласно http://en.wikipedia.org/wiki/Atomicity_ (database_systems)
Например, если я имею:
a = 30
b = 75
Я хотел бы смочь сделать что-то как:
atomic_operation do
a += 10
b -= 39
end
Существует ли собственный модуль в Ruby 1.9, которые позволяют такой процесс? Если возможно, я хотел бы сделать так, не используя плагин.Большое спасибо!
Как вы указываете на статью о базах данных, я полагаю, вы спрашиваете в этом контексте.
Если вы используете Rails, вы используете транзакцию
методы из ActiveRecord .
Account.transaction do
@alice.withdraw!(100)
@bob.deposit!(100)
end
При использовании вне Rails вы должны работать с тем, что предоставляет библиотека драйверов базы данных. Проверьте реализацию транзакции в Rails, чтобы понять, как это можно сделать.
Выбор правильных инструментов для работы действительно зависит от интересующей вас области. Если вы хотите выполнить атомарную операцию с базой данных, драйвер базы данных, вероятно, (если он хорош / база данных поддерживает его) предложит способ использования транзакции базы данных для создания атомарных обновлений.
Если вы говорите о многопоточном приложении Ruby, которое пытается делать обновления общих ресурсов атомарными и поточно-ориентированными, то Ruby предоставляет классы Mutex и ConditionVariable, которые помогут вам в этом отношении. (Дополнительная информация: http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html )
Вы посмотрели на гем 'Transaction Simple'?
Думаю, он подойдет для вашей цели
Что вам нужно, мой друг, так это программная транзакционная память. Попробуйте реализацию STM, с которой я играл в JRuby (вам нужно проверить код в репозитории, так как я не упаковал его для релиза).
Также проверьте Ruby atomic, над которым я работаю http://github.com/saivenkat/ruby-atomic. Дает вам CAS тип операций над MRI. Это немного более низкий уровень, но поможет вам решить ту же проблему. Я еще не написал транзакционную память для MRI, но с инфраструктурой CAS это не займет много времени :)
P.S. Stackoverflow не позволяет мне публиковать больше одной ссылки, так как я не часто пользовался его системой. Так что посмотрите сайт multiverse в codehaus для STM в JRuby
--Sai Venkat