MySQL借助DB完成分布式锁思路详解

发布时间: 2019-10-09 11:30:09 来源: 互联网 栏目: Mysql 点击:

这篇文章重要给大年夜家简介了关于MySQL借助DB完成分布式锁思路的相干材料,文中经过过程示例代码简介的异常详细,对大年夜家进修或许应用MySQL具有必定的参考进修价值,须要的同伙们下面来一路进修进修吧

媒介

不管是单机锁照样分布式锁,道理都是基于共享的数据,断定以后操作的行动。关于单机则是共享RAM内存,关于集群则可以借助Redis,ZK,DB等第三方组件来完成。Redis,ZK对分布式锁供给了很好的支撑,根本上开箱即用,但是这些组件本身要高可用,体系也须要强依附这些组件,额外增长了很多本钱。DB关于体系来讲本身就默许为高可用组件,针对一些低频的营业应用DB完成分布式锁也是一个不错的处理筹划,比如控制多机械下准时义务的起调,针对审批回调剂理等,本文将给出DB完成分布式锁的一些场景和处理筹划,欲望对你启发。

表设计

起重要明白DB在体系中依然须要认为是最脆弱的一环,是以在设计时须要推敲压力成绩,即能应用完成的逻辑就不要放到DB上完成,也就是尽可能少应用DB供给的锁才能,假设是高并发营业则要防止应用DB锁,换成Redis等缓存锁加倍有效。如清单1所示,该表中唯一的束缚为lock_name,timestamp,version三者组合主键,下文会应用这三者完成消极锁,乐不雅锁等营业场景。

清单1: 分布式锁表构造

CREATE TABLE `lock` (
`lock_name` varchar(32) NOT NULL DEFAULT '' COMMENT '锁称号',
`resource` bigint(20) NOT NULL COMMENT '营业主键',
`version` int(5) NOT NULL COMMENT '版本',
`gmt_create` datetime NOT NULL COMMENT '生成时间',
PRIMARY KEY (`lock_name`,`resource`,`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

消极锁完成

关于消极锁营业中罕见的操作有以下两种:


针对A:

A场景当一台机械获得到锁后,其他机械处于列队状况,锁释放后其他机械才能够持续下去,这类应用层面处理是相当费事,是以普通应用DB供给的行锁才能,即select xxx from xxx for update。A场景普通都和营业强接洽关系,比如库存增减,应用营业对象作为行锁便可。须要留意的是,该筹划本质上锁压力照样在数据库上,当阻塞住的线程过量,且操作耗时,最后会出现大年夜量锁超时景象。

针对B:

针对B场景(tryLock)举个详细营业,在集群下每台机械都有准时义务,然则营业上请求同一时辰只能有一台能正常调剂。
处理思路是应用唯一主键束缚,拔出一条针对TaskA的记录,版本则默许为1,拔出成功的算获得到锁,持续履行营业操作。这类筹划当机械挂掉落就会出现逝世锁,是以还须要有一个准时义务,准时清理曾经过时的锁,清理维度可以根据lock_name设置不应时间清理战略。

准时义务清理战略会额外带来复杂度,假定机械A获得到了锁,但由于CPU资本重要,招致处理变慢,此时锁被准时义务释放,是以机械B也会获得到锁,那么此时就出现同一时辰两台机械同时持有锁的景象,处理思路:把超不时间设置为远大年夜于营业处理时间,或许增长版本机制改成乐不雅锁。

insert into lock set lock_name='TaskA' , resource='锁住的营业',version=1,gmt_create=now()
success: 获得到锁
failed:放弃操作
释放锁

乐不雅锁完成

针对乐不雅锁场景,举个详细营业,在后台体系中常常应用大年夜json扩大字段存储营业属性,在触及部分更新时,须要先查询出来,归并数据,写入到DB,这个过程当中假设存在并发,则很轻易形成数据损掉,是以须要应用锁来包管数据分歧性,照应操作以下所示,针对乐不雅锁,不存在逝世锁,是以这里直接存放营业id字段,包管每个营业id有一条对应的记录,并且不须要对应的准时器清除。

select * from lock where lock_name='营业称号', resource='营业id';
不存在: insert into lock set lock_name='营业称号', resource='营业id' , version=1;
获得版本: version
营业操作: 取数据,归并数据,写回数据
写回到DB: update lock set version=version+1 where lock_name='营业称号' and resource='营业id' and version= #{version};
写回成功: 操作成功
写回掉败: 回滚事务,从头操作

乐不雅锁写入掉败会回滚全部事务,是以假设写入抵触很频繁的场景不合适应用乐不雅锁,大年夜量的事务回滚会给DB巨大年夜压力,终究影响到详细营业体系。

总结

分布式锁的道理实际上很轻易懂得,难的是如安在详细营业场景上选择最合适的筹划。不管是哪一种锁筹划都是与营业密切接洽关系,总之没有完美的分布式锁筹划,只要最合适以后营业的锁筹划。

好了,以上就是这篇文章的全部内容了,欲望本文的内容对大年夜家的进修或许任务具有必定的参考进修价值,感谢大年夜家对我们的支撑。

本文标题: MySQL借助DB完成分布式锁思路详解
本文地址: http://yourctp.com/shujuku/mysql/278033.html

假设认为本文对您有所赞助请赞助本站

付出宝扫一扫赞助微信扫一扫赞助

  • 付出宝扫一扫赞助
  • 微信扫一扫赞助
  • 付出宝先领红包再赞助
    声明:凡注明"本站原创"的一切文字图片等材料,版权均属编程客栈一切,迎接转载,但务请注明出处。
    WINDOWS下装置MYSQL教程详解mysql多版本并发控制MVCC的完成
    Top