假如这段操作放到不同的微服务里去使用怎么确保数据的一致性和原子性
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
看了记得给我点个赞~~谢谢~