rubyonrails:Ruby on rails开发从头来( 5十一)- ActiveRecord基础(并发处理)

  在学习Rails中并发处理处理前我们先简单了解下并发处理概念

  在有多个处理同时访问同个数据库应用可能会出现这样情况个处理更新了数据库中而使得另个处理中持有数据变得陈旧了例如A和B先后从数据库中提取了相同数据并都做了修改这时B先将自己修改更新会数据库稍后A将自己修改更新回数据库这时将会覆盖B所作修改当B再次提取数据库后看到是A修改结果而不是自己

  个解决办法就是将更新表或者行进行锁定防止其他进行更新或者访问锁定可以完全避免并发问题也常称作悲观锁但是在Web项目中这个做法是行不通在同个时间点上可能会有很多个用户需要访问数据

  乐观锁并没有将数据锁定外在表现作为替代在将修改写回到数据库的前进行检查来确定条记录是否已经被修改了在Rails里实现思路方法是每和行都包含有个版本号(version number)不管什么时候行被更新了版本号就会被增加当你在你中进行个更新操作时Active Record检查行和Model版本号如果不匹配将会放弃修改并抛出个异常

  对于任何个包含有eger型字段lock_version乐观锁都会默认被启用你可以把新行这个字段为0但是如果你忘记了Active Record也会替你完成

  我们来看看怎样实现乐观锁我们创建个名为counters表:

create table counters (
id not null auto_increment,
count default 0,
lock_version default 0,
primary key (id)
);


  然后我给这个表创建个行将这个行读入到区别Model中并且在其中尝试更新

Counter < ActiveRecord::Base
end
Counter.delete_all
Counter.create(:count => 0)
count1 = Counter.find(:first)
count2 = Counter.find(:first)
count1.count 3
count1.save
count2.count 4
count2.save


  当我们运行上面代码会得到个异常Rails会放弃count2所作修改其中包含已经是脏数据了

  如果使用了乐观锁就需要在中处理这些异常也可以禁用乐观锁:

  ActiveRecord::Base.lock_optimistically = false

  有关乐观锁可以参考Martin Flower所著企业应用解决方案及模式种中有关并发处理和工作单元(Work Unit)模式内容相信对Rails并发处理机制会有更深了解

Tags:  rubyonrails安装 rubyforrails rubyrails rubyonrails

延伸阅读

最新评论

发表评论