惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Privacy & Cybersecurity Law Blog
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
爱范儿
爱范儿
博客园 - 司徒正美
量子位
Recent Commits to openclaw:main
Recent Commits to openclaw:main
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园_首页
月光博客
月光博客
S
SegmentFault 最新的问题
Hacker News - Newest:
Hacker News - Newest: "LLM"
PCI Perspectives
PCI Perspectives
S
Secure Thoughts
Hacker News: Ask HN
Hacker News: Ask HN
Application and Cybersecurity Blog
Application and Cybersecurity Blog
罗磊的独立博客
H
Heimdal Security Blog
小众软件
小众软件
Attack and Defense Labs
Attack and Defense Labs
V
Visual Studio Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Cloudbric
Cloudbric
Stack Overflow Blog
Stack Overflow Blog
L
LINUX DO - 最新话题
Forbes - Security
Forbes - Security
Last Week in AI
Last Week in AI
阮一峰的网络日志
阮一峰的网络日志
W
WeLiveSecurity
IT之家
IT之家
U
Unit 42
H
Hacker News: Front Page
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
The Last Watchdog
The Last Watchdog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
Google Developers Blog
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
V
Vulnerabilities – Threatpost
L
LangChain Blog
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
S
Schneier on Security
F
Fortinet All Blogs
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs

博客园 - 甩掉裤衩凭风吹

Go学习例子(六) Go学习例子(五) Go学习例子(四) Go学习例子(三) Go学习例子(二) Go学习例子(一) 一、Python基础语法 Python爬虫实战一之爬取糗事百科段子 Python爬虫系列:五、正则表达式 Python爬虫系列:四、Cookie的使用 python爬虫系列:三、URLError异常处理 python系列:二、Urllib库的高级用法 python系列:一、Urllib库的基本使用 二十七、mysql如何确保数据不丢失?有几点值得我们借鉴 二十五、sql中where条件在数据库中提取与应用浅析 二十四、如何正确的使用索引? 二十三、mysql索引管理详解 二十二、mysql索引原理详解 二十一、什么是索引?
二十六、聊聊mysql如何实现分布式锁
甩掉裤衩凭风吹 · 2019-11-08 · via 博客园 - 甩掉裤衩凭风吹

分布式锁的功能

  1. 分布式锁使用者位于不同的机器中,锁获取成功之后,才可以对共享资源进行操作

  2. 锁具有重入的功能:即一个使用者可以多次获取某个锁

  3. 获取锁有超时的功能:即在指定的时间内去尝试获取锁,超过了超时时间,如果还未获取成功,则返回获取失败

  4. 能够自动容错,比如:A机器获取锁lock1之后,在释放锁lock1之前,A机器挂了,导致锁lock1未释放,结果会lock1一直被A机器占有着,遇到这种情况时,分布式锁要能够自动解决,可以这么做:持有锁的时候可以加个持有超时时间,超过了这个时间还未释放的,其他机器将有机会获取锁

预备技能:乐观锁

  通常我们修改表中一条数据过程如下:

t1:select获取记录R1
t2:对R1进行编辑
t3:update R1

  我们来看一下上面的过程存在的问题:

  如果A、B两个线程同时执行到t1,他们俩看到的R1的数据一样,然后都对R1进行编辑,然后去执行t3,最终2个线程都会更新成功,后面一个线程会把前面一个线程update的结果给覆盖掉,这就是并发修改数据存在的问题。

  我们可以在表中新增一个版本号,每次更新数据时候将版本号作为条件,并且每次更新时候版本号+1,过程优化一下,如下:

t1:打开事务start transaction
t2:select获取记录R1,声明变量v=R1.version
t3:对R1进行编辑
t4:执行更新操作
    update R1 set version = version + 1 where user_id=#user_id# and version = #v#;
t5:t4中的update会返回影响的行数,我们将其记录在count中,然后根据count来判断提交还是回滚
    if(count==1){
        //提交事务
        commit;
    }else{
        //回滚事务
        rollback;
    }

  上面重点在于步骤t4,当多个线程同时执行到t1,他们看到的R1是一样的,但是当他们执行到t4的时候,数据库会对update的这行记录加锁,确保并发情况下排队执行,所以只有第一个的update会返回1,其他的update结果会返回0,然后后面会判断count是否为1,进而对事务进行提交或者回滚。可以通过count的值知道修改数据是否成功了。

  上面这种方式就乐观锁。我们可以通过乐观锁的方式确保数据并发修改过程中的正确性。