根据http://en.wikipedia.org/wiki/Atomicity_(database_systems)
,我想用Ruby执行一些原子性方法例如,如果我有:
a = 30
b = 75
我希望能够做到这样的事情:
atomic_operation do
a += 10
b -= 39
end
Ruby 1.9中是否有允许此类过程的本机模块?如果可能的话,我想在不使用插件的情况下这样做。非常感谢!
答案 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的块顺序运行。
答案 2 :(得分:4)
当你指向一篇关于数据库的文章时,我猜你在这个背景下问。
如果您使用的是Rails,则可以使用methods的transaction
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)