乐观锁version和时间戳外的实现方式


乐观锁并不会使用数据库提供的锁机制

第一种:version版本号
使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新操作都对版本号执行+1操作
version类型为int就够了,保守点用long,建议用long不出错
version = version +1 是原子化操作

第二种:时间戳来实现
你不能从web服务器取得时间,要以数据库服务器时间为准
version类型为DATETIME
version = now()
now()精度百万分之一秒,但仍然可能重复,只是概率极小。


第三种:通过生成id来实现
前两种方式,如果用ORM,都要写 raw 的代码。而且数据库改一行就要算一次当前时间或者version+1
如果直接生成id,就可以避免数据库的运算和raw麻烦的写法。

(1)用guid:
guid基本不会重复,也可以基于时间+随机生成,但是太长了

(2)用事务id:
version类型为long
事务id是自增的,一般来说要用乐观锁的地方都是有事务的。但如果有跨多个事务的话要取多次。


(3)用公共自增id:
mysql 的uuid_short函数

select uuid_short()
一台服务不够了分片的
select ((uuid_short() - 98069822578884610) << 8) | (@@server_id & 255)

postgre的Sequence序列
SELECT nextval('request_post_seq')

(4)snowflake:
好像没有必要,version 一般是hidden字段,就算上面的version的自增被看到,也只是知道request post之类的次数,应该也没什么用。
有时候需要把version给前端,用户改了数据把version提上来,version和当前数据库一样才能改数据。这种乐观锁用时间戳就好了。如果非要用公共自增又不放心,那把version对称加密下就好了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值