当前位置: 首页 > news >正文

分布式锁和分布式事务

分布式锁

没有图形,只通过大量文字进行说明。分布式锁:redis分布式锁, zk分布式锁, 数据库做分布式锁

redis分布式锁

  1. setnx key value ex 10 原子操作

  2. AB两个线程减库存业务,假设库存是10

  3. A线程获取锁,B线程等待,此时A线程释放锁,程序还未执行完成。此时B线程获取锁,此时A,B都将库存减到9,与业务不符。
    解决办法:锁续期。

  4. 为了解决单机redis瓶进,采用redis集群。一主一从,线程A从主机获取锁,此时主宕机,线程B从从机也获取了锁
    解决办法:使用红锁 5(奇数)台redis集群,没有主从概念,假设编号为B1 B2 B3 B4 B5。请求依次执行,当一半以上加锁成功才算加锁成功,此时A线程依次加锁成功B1 B2 B3即获取锁成功。 线程B 加锁B4 B5成功,没有获取锁。此时还存在一个问题,如果B3宕机,马上重启成功。此时线程B 加锁B3 B4 B5成功,也获取了锁,这是红锁存在的问题。解决办法:延时重启

    其实实际中采用单机redis做分布式锁即可,使用分布式框架redisson。
    5.线程A获取锁,此时 如果程序jvm线程stw, 会导致锁丢失。仍然想获取锁可以使用 zk(节点)+数据库。线程A获取锁,返回将锁存放在数据库中,此时JVM stw, 线程b去获取锁,修改锁,与数据库已经存在的锁标识进行对比。

数据库做分布式锁

锁的id作为主键索引或者唯一索引

分布式事务

-----------程序A---------->程序B----->----------
| |
|
|
DB DB
AB两个串行执行的程序都有数据库操作,程序A执行后,程序B出现异常时,数据库如何进行回滚

采用了协调者角色,框架iso,seateAT
两段式提交

  1. 投票阶段
  2. 提交/回滚阶段

扩展:三段式提交

提高高并发设计

程序请求后直接返回

自己手写mq监控程序(定时任务+web)请求mq和操作数据库

http://www.lryc.cn/news/41186.html

相关文章:

  • RK3568平台开发系列讲解(驱动基础篇)I2C协议介绍
  • HTML 音频(Audio)
  • 什么是Vue
  • python 内置函数和多线程
  • 【Spring】我抄袭了Spring,手写一套MySpring框架。。。
  • vue中的生命周期
  • 硬件原理图设计规范(二)
  • 复旦微ZYNQ7020全国产替代方案设计
  • 蓝桥杯真题——自动售水机
  • 软件质量保证与测试 课程设计 测试报告 缺陷报告撰写方法
  • vue2和vue3中路由的区别和写法?
  • 【数据结构】第四站:单链表力扣题(一)
  • SAP BPC简介
  • Linux网络概述
  • Mybatis --- 获取参数值和查询功能
  • 【C++】C++入门,你必须要知道的知识
  • spring(七):事务操作
  • Word怎么转换成PDF文件格式?思路提供
  • HCIE-Cloud Computing LAB备考第二步:逐题攻破--第五题:规划--根据网络平面规划表,完成ensp中接入交换机SW1/2的配置
  • 【无标题】Perforce研讨会回顾 | Helix Core在芯片行业的应用实例:芯片项目的版本控制、持续集成及自动化
  • AdamW 优化器
  • 手把手教你基于HTML、CSS搭建我的相册(上)
  • 基于Redis实现的延时队列
  • (3.16——3.19)本周后半段总结
  • C++ 基础: cin和getline() 有啥区别?
  • 在使用fastjson中遇到的问题
  • C++造轮子飙车现场之无锁、有锁环形队列实现
  • Spring Profiles and @Profile
  • 数据分析-数据探索
  • 7个最受欢迎的Python库,大大提高开发效率