Rails应用程序中同时修改操作冲突问题的解决方案

 更新时间:2015年03月23日 09:56:25   投稿:junjie  
这篇文章主要介绍了Rails应用程序中同时修改操作冲突问题的解决方案,本文讲解使用Rails 的 乐观锁解决这个问题并给出了代码救命,需要的朋友可以参考下

Rails 应用程序中操作冲突是一个常见问题,Rails 提供了简单有效的解决方法。

举一个实际的例子:我们的系统里有一个商店模块,商店中重要的一块是对产品信息的管理,比如运营人员常常会编辑产品的信息,包括产品标题,营销口号和价格等等。因为修改十分频繁,碰巧同时编辑提交修改的话,就会偶尔遇到修改丢失的问题,运营人员 A 修改产品标题,运营人员 B 修改价格,A 和 B 提交修改都提示修改成功,但是结果上只是 A 的修改结果生效,B 的修改被 A 的修改冲掉了。

仔细研究原因,发现是因为修改功能缺少操作冲突机制,而修改操作同时发生导致了问题。 如下图所示,A 和 B 同时从数据库中查询数据,在 web 页面中修改同样的数据,提交保存时是以 web 页面中提交的数据为准,从而导致 A 的修改把 B 的修改给覆盖了。

Rails 的 乐观锁Optimistic Locking 是解决这个问题的有力工具,它的原理是在数据库表中增加一个字段(默认是 lock_version,可配置)记录数据的版本号,每个提交的修改都带上这个版本号,在真正 update 修改数据之前,先判断提交的 lock_version 数据和数据库中的是否一致,如果不一致,则认为发生数据冲突,将抛出 ActiveRecord::StaleObjectError 异常,这样程序就可以捕获这个异常,提醒用户发生了冲突,由用户去协调解决冲突。

相关示例代码如下所示:

复制代码 代码如下:

# migration: add lock_version to products
add_column :products, :lock_version, :integer, defalut: 0

# update product with StaleObjectError checking
begin
  product.update(params[:product])
rescue ActiveRecord::StaleObjectError
  render 'confilct'
end

相关文章

  • Ruby中的block、proc、lambda区别总结

    Ruby中的block、proc、lambda区别总结

    这篇文章主要介绍了Ruby中的block、proc、lambda区别总结,本文讲解了yield 和 block call 的区别、block 和 proc、lambda 的区别、proc 和 lambda 的区别,需要的朋友可以参考下
    2015-03-03
  • Ruby语言中的String深入理解

    Ruby语言中的String深入理解

    在java中,对于字面量的字符串,jvm内部维持一张表,因此如果在java中,str1和str2是同一个String对象。而在Ruby中, str1和str2是完全不同的对象。
    2011-01-01
  • 简单对比分析Ruby on Rails 和 Laravel

    简单对比分析Ruby on Rails 和 Laravel

    web应用程序开发中两个相对而言更加流行的框架是 Ruby on Rails 和 Laravel. 它们两个都是非常成熟的项目,已经面世相当长一段时间了 .
    2014-07-07
  • Ruby的安装与运行

    Ruby的安装与运行

    本文给大家分享的是ruby的基础知识,是学习ruby必须掌握的ruby的安装和运行以及ruby的文档,非常实用,有需要的小伙伴可以参考下。
    2016-02-02
  • rails 连接mysql的问题解决

    rails 连接mysql的问题解决

    如果是先安装ruby 和rails,后安装mysql,可能会出现如下错误
    2008-12-12
  • 分析 rudy 类

    分析 rudy 类

    分析 rudy 类...
    2007-11-11
  • 在操作系统上安装Ruby解释器的教程

    在操作系统上安装Ruby解释器的教程

    这篇文章主要介绍了在操作系统上安装Ruby解释器的教程,包括Linux系统以及Unix和Windows系统下的安装方法,需要的朋友可以参考下
    2015-10-10
  • 详解Ruby语言中的注释用法与中文编码问题

    详解Ruby语言中的注释用法与中文编码问题

    这篇文章主要介绍了Ruby语言中的注释用法与中文编码问题,是Ruby入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • 淘宝网提供的国内RubyGems镜像简介和使用方法

    淘宝网提供的国内RubyGems镜像简介和使用方法

    由于国内的网络环境,导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败,因此使用gem或bundle时常常会遇到长久无响应的情况
    2014-04-04
  • 简要解读Ruby面向对象编程中的作用域

    简要解读Ruby面向对象编程中的作用域

    作用域在面向对象编程中是一个十分重要的概念,程序构建时必须要理解清楚类和方法以及对象的作用范围,接下来就为大家简要解读Ruby面向对象编程中的作用域
    2016-05-05

最新评论