根据http://en.wikipedia.org/wiki/Atomicity_(database_systems),我想用 Ruby 执行一些原子性方法
例如,如果我有:
a = 30
b = 75
我希望能够做类似的事情:
atomic_operation do
a += 10
b -= 39
end
Ruby 1.9 中是否有允许此类过程的本机模块?如果可能的话,我想在不使用插件的情况下这样做。非常感谢!
根据http://en.wikipedia.org/wiki/Atomicity_(database_systems),我想用 Ruby 执行一些原子性方法
例如,如果我有:
a = 30
b = 75
我希望能够做类似的事情:
atomic_operation do
a += 10
b -= 39
end
Ruby 1.9 中是否有允许此类过程的本机模块?如果可能的话,我想在不使用插件的情况下这样做。非常感谢!
这实际上取决于您对适合该工作的工具感兴趣的范围。如果您正在寻找对数据库执行原子操作,那么数据库驱动程序可能(如果它有任何好处/数据库支持它)提供一种使用数据库事务来使更新原子化的方法。
如果您谈论的是一个多线程 Ruby 应用程序,它试图以原子和线程安全的方式更新共享资源,那么 Ruby 提供了 Mutex 和 ConditionVariable 类来帮助您解决这方面的问题。(更多信息:http ://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html )
Mutex 类在 1.9 运行时(和require('thread')
1.8)中可用,并允许您在上下文中锁定操作。
# Typically defined in the object initializer
@lock = Mutex.new
# Then in your code
@lock.synchronize do
a += 10
b -= 39
end
这将保证给 Mutex#synchronize 的块按顺序运行。
当您指向有关数据库的文章时,我猜您是在这种情况下问的。
如果您使用 Rails,则使用ActiveRecord的transaction
方法。
Account.transaction do
@alice.withdraw!(100)
@bob.deposit!(100)
end
如果在 Rails 之外使用,您必须使用数据库驱动程序库提供的内容。检查Rails上事务的实现,了解它是如何完成的。
我的朋友你需要的是软件事务内存。试试我在 JRuby 中使用过的 STM 实现(您需要在 repo 中签出代码,因为我还没有为发布打包它)。
另请查看我正在研究的 Ruby atomic http://github.com/saivenkat/ruby-atomic。为您提供 CAS 类型的 MRI 操作。这是一个较低的级别,但会帮助您解决同样的问题。我还没有为 MRI 写过 Transactional Memory,但是有了 CAS 基础设施,它不会很长 :)
PS Stackoverflow 不允许我发布多个链接,因为我没有经常使用它的系统。因此,请查看 codehaus 中的 multiverse site for STM in JRuby
——赛文卡特