• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > 利用SQL实现简单的分布式锁

利用SQL实现简单的分布式锁

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了sql 锁表,sql 锁,sql 事务锁,sql server 锁表,sql server 查看锁等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

利用SQL实现简单的分布式锁


分布式锁和普通锁的主要区别在于参与主体跨不同节点,因此需要考虑到节点失效和网络故障的问题。搞清楚问题要点,可以用各种不同的东西去实现,比如Redis,ZooKeeper等。但是其实用SQL实现也是非常容易的,下面以PostgreSQL为例进行说明。

1. 方法1:会话锁

利用PostgreSQL中特有的排他会话级别咨询锁。
pg_advisory_lock(key bigint)
pg_advisory_unlock(key bigint)
pg_try_advisory_lock(key bigint)

详细参考: http://www.postgres.cn/docs/9.4/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS-TABLE

这种锁是会话级的,在释放锁之前,锁的获得得者必须一直持有这个会话,也就是连接,否则锁就会被释放。
这个特性自然而然地解决了锁的获得者发生故障时锁的释放问题。
但是,对于需要长时间持有的锁,它会产生长连接,而数据库的连接是比较耗资源的,往大了配一般也就几千个,这是需要注意的地方。
另外一个需要考虑的问题是,当网络或节点发生故障时连接的两端未必能立刻感知到,因此TCP的KeepAlive是必须的,幸好PostgreSQL的客户端和服务端都支持这个设置。
下面是服务端的参数:
tcp_keepalives_idle
tcp_keepalives_interval
tcp_keepalives_count

2. 方法2:期限锁

锁对象是持久的,为防止拿到锁的客户端奔溃导致锁无法释放,每个锁都有一个过期期限。
在PostgreSQL中可以按下面的方式实现

建表
  1. postgres=# create table distlock(id int primary key,expired_time interval,owner text,ts timestamptz);
  2. CREATE TABLE
  3. postgres=# insert into distlock(id) values(1);
  4. INSERT 0 1

加锁和续期
  1. postgres=# update distlock set owner='node1',ts=now(),expired_time=interval '20 second' where id=1 and (owner='node1' or owner is null or now() > ts + expired_time);
  2. UPDATE 1
获得锁的客户端如果要长时间持有锁必须定期执行相同的方法对锁进行续租,否则会丢锁。

此时,其它客户端取锁会失败
  1. postgres=# update distlock set owner='node2',ts=now(),expired_time=interval '20 second' where id=1 and (owner='node2' or owner is null or now() > ts + expired_time);
  2. UPDATE 0

等锁过期后取锁成功
  1. postgres=# update distlock set owner='node2',ts=now(),expired_time=interval '20 second' where id=1 and (owner='node2' or owner is null or now() > ts + expired_time);
  2. UPDATE 1

释放锁
  1. postgres=# update distlock set owner=null,ts=now() where id=1 and owner='node2';
  2. UPDATE 1

3. 总结

可以看到用关系数据库实现分布式锁并不复杂。尤其上面基于表实现的锁辅以靠谱的HA部署可以保障锁信息的持久性和不丢失,但用表更新实现锁毕竟比较重,不适合对锁的性能要求非常高的场景。

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 利用SQL实现简单的分布式锁

相关文章

  • 2017-05-26我的android学习经历13,android学习经历13
  • 2017-05-26Android自定义控件系列案例【四】
  • 2017-05-26PostgreSQL的区域设置
  • 2017-05-26andriod 获取电池的信息,andriod获取电池
  • 2017-05-26android.view.InflateException: Binary XML file line #34: Error inflating class,
  • 2017-05-26BottomBar之Android底部菜单,bottombarandroid
  • 2017-05-26android权限大全
  • 2017-05-26【转载】ReactiveX 的理念和特点,转载reactivex理念
  • 2017-05-26安卓开源项目周报0215,安卓开源项目0215
  • 2017-05-26自定义图片轮播框架。也是作为依赖库使用的哦,自定义框架

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android自动化构建之Ant多渠道打包实践分析(上)
    • android:数据存贮方式-SharedPreference
    • 年底了,给MySQL做个例行巡检吧
    • 4.1.1 Activity初学乍练
    • Android自定义实现循环滚轮控件WheelView
    • Android中自定义视图View之---进阶篇(Canvas的使用)
    • redis master-slave 切换演练
    • lesson15-QT多线程
    • Android 如何本地加载pdf文件,android加载pdf
    • Android学习笔记之SoftReference软引用,弱引用WeakReference,weakreference

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有