文档章节

java分布式锁的处理

o
 osc_n6euf5h6
发布于 2019/03/19 21:07
字数 814
阅读 5
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

分布式锁产生的原因是:当多个客户端要同时并发操作数据库时,可能查出来的数据是相同的而后继续写的时候会出现事务方面的问题。如:商品只有一件而后被出售两次,造成数据幻读。

 

分布式锁的处理方案有:

  使用redis操作,

  使用zookeeper操作,

  数据库方面操作(行锁)

以上所有的操作都是相当于在多个客户端之间放一把锁,类似于线程之间争夺锁的过程。

 

三种方案比较:

 

从理解的难易程度角度(从低到高)

  数据库 > 缓存 > Zookeeper

从实现的复杂性角度(从低到高)

  Zookeeper >= 缓存 > 数据库

从性能角度(从高到低)

  缓存 > Zookeeper >= 数据库

从可靠性角度(从高到低)

  Zookeeper > 缓存 > 数据库

 

具体的实现过程是:

  1.用redis实现

    可以使用redis的set(key,1,30,Nx)命令(在redis 2.6以上版本支持),其中的key可以使用这些客户端都要操作产品的id号去实现。

    那么当解锁时需删除key,删除key要注意避免出现之前线程执行的时间很长导致删除key时删除了后面的客户端key。那么这是要注意设置key-value时一定要将value设置为对应线程的id号而后执行删除对应线程或者客户端的key。

  2.用数据库实现

    一.基于数据库表

      最简单的方式可能就是直接创建一张锁表,当我们要锁住某个方法或资源时,我们就在该表中增加一条记录,想要释放锁的时候就删除这条记录。给某字段添加唯一性约束,如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功,那么我们就可以认为操作成功的那个线程获得了该方法的锁,可以执行方法体内容。

      缺点:会引入数据库单点、无失效时间、不阻塞、不可重入等问题

    二.基于数据库的排他锁

      如果使用的是MySql的InnoDB引擎,在查询语句后面增加 for update ,数据库会在查询过程中(须通过唯一索引查询)给数据库表增加排他锁,我们可以认为获得排它锁的线程即可获得分布式锁,而后可以通过 connection.commit() 操作来释放锁。

会引入数据库单点、不可重入、无法保证一定使用行锁(部分情况下MySQL自动使用表锁而不是行锁)、排他锁长时间不提交导致占用数据库连接等问题。

  优点:

    直接借助数据库,容易理解。

  缺点:

    •   会引入更多的问题,使整个方案变得越来越复杂
    •   操作数据库需要一定的开销,有一定的性能问题
    •   使用数据库的行级锁并不一定靠谱,尤其是当我们的锁表并不大的时候

   3.使用zookeeper实现

      借用大佬的博客:https://www.cnblogs.com/garfieldcgf/p/6380816.html

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.5K
8
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.2K
3
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
代码生成器--Codgen

Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数据模型这棵树的根节...

黄天政
2013/01/29
1.4W
2

没有更多内容

加载失败,请刷新页面

加载更多

程序员职场:拥有一个学位将会在你的职业生涯中更加顺利!

1、作为程序员为什么要拥有学位? 很多情况下,作为程序员,学位是进入大公司的敲门砖。 现在很多大的科技公司,学位是硬性要求。 一般都是本科以上的学历,甚至有的必须是硕士以上学历。 如...

IT技术分享社区
03/03
12
0
varchar和nvarchar有什么区别? - What is the difference between varchar and nvarchar?

问题: Is it just that nvarchar supports multibyte characters? 只是nvarchar支持多字节字符吗? If that is the case, is there really any point, other than storage concerns, to us......

技术盛宴
35分钟前
5
0
用flutter给图片加个好看的遮罩层【flutter20个实例之六】

一、老套路,先看样式 左起图一是我业务中的样式,左起图二、三是下方源码展示样式(复制可直接运行,无额外组件引入) 二、讲解 1.结构拆分 我们先看下页面布局结构,首先肯定是有个GridVie...

一代码农码一代
36分钟前
17
0
世界上最美的瀑布在这里,太美了!

亲近大自然,高山流水遇知音,倾听心灵的声音。。。 声明:文章及图片、视频来自网络,如有版权方面的疑问请和我们联系,我们将在24小时内删除。 本文分享自微信公众号 - Python提升课堂(DJXY0...

花儿开放
2014/08/17
0
0
商城小程序制作流程

随着商城小程序的火爆,很多商家都迫不及待的想制作商城小程序,下面就和大家分享一下商城小程序制作流程? 第1步: 注册并认证小程序账号 注册并认证小程序账号,打开百度搜索,“微信公众平...

木鱼小铺小程序1
46分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部