mos*_*shi 7 ruby transactions atomic atomicity ruby-1.9
根据http://en.wikipedia.org/wiki/Atomicity_(database_systems),我想用Ruby执行一些原子性方法.
例如,如果我有:
a = 30
b = 75
Run Code Online (Sandbox Code Playgroud)
我希望能够做到这样的事情:
atomic_operation do
a += 10
b -= 39
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这将保证给予Mutex#synchronize的块按顺序运行.
官方文档在这里:http://rubydoc.info/stdlib/core/1.9.2/Mutex
当您指向有关数据库的文章时,我想您是在这种情况下问的。
如果您使用Rails,您使用的transaction 方法的ActiveRecord的。
Account.transaction do
@alice.withdraw!(100)
@bob.deposit!(100)
end
Run Code Online (Sandbox Code Playgroud)
如果在Rails之外使用,则必须使用数据库驱动程序库提供的内容。检查Rails上的事务实现,以了解如何完成事务。
| 归档时间: |
|
| 查看次数: |
4317 次 |
| 最近记录: |