写一个原子操作

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中是否存在允许此类过程的本机模块?如果可能的话,我想在不使用插件的情况下这样做.非常感谢!

Mik*_*ffe 7

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

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


zim*_*atm 6

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


Chu*_*bas 5

当您指向有关数据库的文章时,我想您是在这种情况下问的。

如果您使用Rails,您使用的transaction 方法ActiveRecord的

Account.transaction do
  @alice.withdraw!(100)
  @bob.deposit!(100)
end
Run Code Online (Sandbox Code Playgroud)

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