写一个原子操作

时间:2010-07-07 22:53:09

标签: ruby transactions atomic ruby-1.9 atomicity

根据http://en.wikipedia.org/wiki/Atomicity_(database_systems)

,我想用Ruby执行一些原子性方法

例如,如果我有:

a = 30
b = 75

我希望能够做到这样的事情:

atomic_operation do
  a += 10
  b -= 39
end

Ruby 1.9中是否有允许此类过程的本机模块?如果可能的话,我想在不使用插件的情况下这样做。非常感谢!

5 个答案:

答案 0 :(得分:7)

这实际上取决于您对工作的正确工具感兴趣的范围。如果您希望对数据库执行原子操作,那么数据库驱动程序可能(如果它有任何好处/数据库支持它)提供了一种使用数据库事务来使更新成为原子的方法。

如果您正在讨论试图对共享资源进行原子和线程安全更新的多线程Ruby应用程序,那么Ruby提供了Mutex和ConditionVariable类来帮助您解决这个问题。 (更多信息:http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html

答案 1 :(得分:6)

Mutex类在1.9运行时(以及1.8中的require('thread'))中可用,并允许您在上下文中锁定操作。

# Typically defined in the object initializer
@lock = Mutex.new

# Then in your code
@lock.synchronize do
  a += 10
  b -= 39
end

这将保证给予Mutex#synchronize的块顺序运行。

官方文件在这里:http://rubydoc.info/stdlib/core/1.9.2/Mutex

答案 2 :(得分:4)

当你指向一篇关于数据库的文章时,我猜你在这个背景下问。

如果您使用的是Rails,则可以使用methodstransaction ActiveRecord

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

如果在Rails之外使用,则必须使用数据库驱动程序库提供的内容。检查Rails上的implementation of transaction以了解如何完成。

答案 3 :(得分:2)

你需要什么我的朋友是一个软件交易记忆。试试我在JRuby中一直在玩的STM实现(你需要在repo中检查代码,因为我还没有为它发布包装)。

另请查看我正在使用http://github.com/saivenkat/ruby-atomic的Ruby原子。在MRI上为您提供CAS类型的操作。这是一个较低的水平,但将帮助您解决同样的问题。我没有为MRI编写事务性内存,但使用CAS基础结构不会很长时间:)

P.S Stackoverflow不允许我发布多个链接,因为我没有大量使用它的系统。因此,在JRuby

中查看codehaus for STM中的多元宇宙网站

- Sai Venkat

答案 4 :(得分:0)

您是否看过'简单交易'宝石?

我认为这符合您的目的

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