Запишите атомарную операцию

Я хотел бы выполнить некоторую атомарность методов с Ruby, согласно http://en.wikipedia.org/wiki/Atomicity_ (database_systems)

Например, если я имею:

a = 30
b = 75

Я хотел бы смочь сделать что-то как:

atomic_operation do
  a += 10
  b -= 39
end

Существует ли собственный модуль в Ruby 1.9, которые позволяют такой процесс? Если возможно, я хотел бы сделать так, не используя плагин.Большое спасибо!

7
задан kiamlaluno 31 July 2010 в 22:44
поделиться

4 ответа

Как вы указываете на статью о базах данных, я полагаю, вы спрашиваете в этом контексте.

Если вы используете Rails, вы используете транзакцию методы из ActiveRecord .

Account.transaction do
  @alice.withdraw!(100)
  @bob.deposit!(100)
end

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

5
ответ дан 6 December 2019 в 09:18
поделиться

Выбор правильных инструментов для работы действительно зависит от интересующей вас области. Если вы хотите выполнить атомарную операцию с базой данных, драйвер базы данных, вероятно, (если он хорош / база данных поддерживает его) предложит способ использования транзакции базы данных для создания атомарных обновлений.

Если вы говорите о многопоточном приложении Ruby, которое пытается делать обновления общих ресурсов атомарными и поточно-ориентированными, то Ruby предоставляет классы Mutex и ConditionVariable, которые помогут вам в этом отношении. (Дополнительная информация: http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html )

7
ответ дан 6 December 2019 в 09:18
поделиться

Вы посмотрели на гем 'Transaction Simple'?

Думаю, он подойдет для вашей цели

http://rubyforge.org/projects/trans-simple

0
ответ дан 6 December 2019 в 09:18
поделиться

Что вам нужно, мой друг, так это программная транзакционная память. Попробуйте реализацию STM, с которой я играл в JRuby (вам нужно проверить код в репозитории, так как я не упаковал его для релиза).

Также проверьте Ruby atomic, над которым я работаю http://github.com/saivenkat/ruby-atomic. Дает вам CAS тип операций над MRI. Это немного более низкий уровень, но поможет вам решить ту же проблему. Я еще не написал транзакционную память для MRI, но с инфраструктурой CAS это не займет много времени :)

P.S. Stackoverflow не позволяет мне публиковать больше одной ссылки, так как я не часто пользовался его системой. Так что посмотрите сайт multiverse в codehaus для STM в JRuby

--Sai Venkat

2
ответ дан 6 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: