rails 乐观锁

定义:
当我们获取数据后,可能会有多个人同时修改数据,为了保证修改数据没有冲突,所以rails引进了乐观锁的概念,当多个人同时修改数据,那么最先修改的才会起作用,其他都会失效,如果想要再次修改必须获得最新的数据。

场景:
乐观锁适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据。

现在就为大家演示下乐观锁的基本过程:

一、准备
1、下载种子文件并将其导入到数据表中:
在浏览器里打开下面这个网址,下载下来放在rails项目里的 db目录下:
点击这里下载数据资源
首先我们要脚手架的数据模型:rails generate scaffold Product title:string description:text image_url:string price:decimal

将模型迁移到数据库中生成对应的数据表:rails db:migrate
rails 乐观锁
再将我们的种子数据导入到生成的数据表中运行:rails db:seed
rails 乐观锁
2、要使用乐观锁的表需要有一个lock_versionc的字段,每次更新记录的时候
create_at会自动增加这个字段的值,我们可以通过rails自带的生成器创建按这个字段:rails generate migration add_lock_version_to_products lock_version:integer
rails 乐观锁
3、将我们刚才新添加的字段迁移到数据库的products表中:rails db:migrate
rails 乐观锁
此时我们可以在db/schema.rb里查看我们生成的products表的结构:
rails 乐观锁
4、登录到rails的控制台:rails console/rails c
rails 乐观锁
5、查看数据表中的所有数据
可以看出所有数据的lock_version的值都为0
rails 乐观锁
二、实践
1、假设有user_a和user_b同时获取了id为1的数据
rails 乐观锁
2、这个时候如果user_a先修改了id为1的数据
这里先将user_a的标题修改成了bruceelee,然后将其保存在数据库中,可以看到当前的lock_version的值变为了1.
rails 乐观锁
3、这时如果b同样去修改对应的标题就会报错
这里会提示你试图去修改一个旧的数据
rails 乐观锁
4、我们再看看id为1的数据有没有更改为user_b修改的数据
发现此时的数据依然是user_a修改的数据

rails 乐观锁