六: 高并发下如何安全修改同一行数据

多个用户下订单, 生成全局自增的订单ID
定义全局变量 a =0,
启动50 个线程 生成50 个订单id 时 a+1, 会有重复的订单id 出现。 线程不安全

解决:

一:基于 jvm 解决方式。
1.将全局变量, 自增时得代码块 加Synchorized 关键字
2. lock lock= new ReentranLock()
try{
lock.lock()
将全局变量, 自增时得代码块
}finally{
lock.unlock();
}

二: 分布式 解决方式
数据库锁 : 悲观锁。。。。性能非常差
redis 锁 : 容易产生死锁

Zookeeper 锁

数据监听触发器
在这里插入图片描述

持久节点, 与zookeeper 客户端 断开 数据还存在
临时节点:与zookeeper 客户端 断开 数据还不存在

不带变编号的节点:create aaa 后 再 create aaa 会报错
带编号的节点:create aaa 生成 aaa_000001 的编号节点
再create aaa 不会报错 生成aaa_000002 的编号节点
在这里插入图片描述

基于异常的分布式锁(基于临时节点)
创建不带序号的节点, 创建成功获得锁, 创建不成功, 会抛出异常, 监听lock 节点, 当lock 删除时,再重新去创建节点

在这里插入图片描述

基于相互监听(性能高, 占用资源, 基于临时带序号的节点)
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值