分布式服务器读写数据问题

假如这段操作放到不同的微服务里去使用怎么确保数据的一致性和原子性

func change_balance(uid, amount int64){
    user := getUser(uid) // user: { balance } 进行数据库查询select * from t_user where uid = uid
	if user.balance + amount < 0 {
		return errors.new("balance error")
	}
	user.balance += amount
	save(user) //update t_user set balance = user.balance where uid = uid
}

同进程内

使用sync.Mutex的lock和unlock进行锁定

 不同进程的解决方案有

这里是搜集的资料,可以参考学习 https://www.cnblogs.com/xuwc/p/14015398.html

以下是以上文章的部分内容:

分布式锁的实现有哪些

  • Memcached:利用 Memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情况下,才能 add成功,也就意味着线程得到了锁。
  • Redis:和 Memcached 的方式类似,利用 Redis 的 setnx 命令。此命令同样是原子性操作,只有在 key 不存在的情况下,才能 set 成功。
  • Zookeeper:利用 Zookeeper 的顺序临时节点,来实现分布式锁和等待队列。Zookeeper 设计的初衷,就是为了实现分布式锁服务的。
  • Chubby:Google 公司实现的粗粒度分布式锁服务,底层利用了 Paxos 一致性算法。

分布式锁的几种解决方案

参考:

https://www.jianshu.com/p/a1ebab8ce78a

https://www.cnblogs.com/moxiaotao/p/10829799.html

https://www.cnblogs.com/wlwl/p/11651409.html

https://www.cnblogs.com/austinspark-jessylu/p/8043726.html

https://blog.csdn.net/wuzhiwei549/article/details/80692278

看了记得给我点个赞~~谢谢~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值