.net core 下的分布式事务锁

系统分布式锁的用法

公司框架新增功能分布式锁:

锁的性能之王:缓存 > Zookeeper >= 数据库

锁的实现

实现原理:核心采用StackExchange.Redis的LockTake方法实现。
支持同步获取锁,或者等待直到超时获取锁。

/// <summary>/// 分布式锁,提供全局分布式锁支持,以resource redis为基础/// 这个锁只能通过RpcContext来获取,通过自己手动释放/// </summary>public sealed class DistributedLock{private static readonly TimeSpan DefaultAbandonmentCheckFrequency = TimeSpan.FromSeconds(2);public readonly string lockName;private readonly string lockValue;private readonly int  checkTimeSpan = 50; //msprivate readonly int autoDelete;private DistributedLock(){}/// <summary>/// /// </summary>/// <param name="lockName"></param>/// <param name="autoDelete">自动删除,ms,默认 60s</param>/// <param name="checkTimeSpan">如果不能获取锁,重复检查间隔:默认 50ms</param>internal DistributedLock(string lockName, int autoDelete = 60000,int checkTimeSpan = 50){// note that just Global\ is not a valid nameif (string.IsNullOrEmpty(lockName))throw new ArgumentNullException("lockName不能为空");if (null == ResourceCache.Instance)throw new Exception(@"ResourceCache 没有配置或无法连接");this.checkTimeSpan = Math.Max(checkTimeSpan,1);this.autoDelete = Math.Max(autoDelete,1);this.lockName = lockName;this.lockValue = lockName;}/// <summary>/// 获取锁/// </summary>/// <param name="timeout">超时为null,则尝试一次即返回</param>/// <returns>获取锁成功?</returns>internal bool Acquire(TimeSpan? timeout = null){bool bLock = false;var dtStart = DateTime.Now.Ticks;while (!bLock){bLock = TryAcquireOnce();if (timeout == null){break;}if (!bLock){Thread.Sleep(this.checkTimeSpan);}var ts = new TimeSpan(DateTime.Now.Ticks - dtStart);if (ts >= timeout){break;}}return bLock;}//此处采用框架上下文管理分布式事务锁的释放,代码略。//public void Dispose()//{//    LockManager.ReleaseLock(this);//}internal void Release(){try{var bRtn = ResourceCache.Instance.LockRelease(this.lockName, this.lockValue);Trace.WriteLine($"释放锁 {this.lockName}:{bRtn}");}catch (Exception e){LogTextWriter.Write($"释放锁失败,系统自动超时释放:{this.lockName}");}}/// <summary>/// 释放锁/// </summary>public void ReleaseLock(){LockManager.ReleaseLock(this);}private bool TryAcquireOnce(){try{Trace.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:TryAcquireOnce");var @lock = ResourceCache.Instance.LockTake(this.lockName, this.lockValue, new TimeSpan(0, 0, 0, 0, this.autoDelete));return @lock;}catch (Exception e){return false;}}}

锁的使用

在当前上下文中获取一个分布式锁,第一个获取锁的将执行依赖当前key(一般为业务主键)的完整业务流程(包括多个微服务之间的调用和数据库的访问;

后来者将无法获取锁,根据返回的结果来判断是否进入流程,如果返回的锁为null将不能执行下面的流程,要么重试等待锁释放,要么返回错误.

锁的调用一般流程:

        var qtLock=TryGetLock(lockKey);if(qtLock==null) { //提示不能同时执行操作return;}else  {//进行业务流程}//最后别忘了qtLock.ReleaseLock();

API 内的范例:

 code = StatusCode.OK;//传入超时时间,可以一直等待到超时过期var lockSaveReceipt = this.Context.TryGetLock($"{nameof(SaveReceipt)}.{valueArgs.ReceiptArgs.ReceiptId}");if (lockSaveReceipt == null){code = PublicErrorCode.SaveReceiptByUsed.ToCode();return null;}try{//todo 业务操作1//todo 业务操作2//...}finally{lockSaveReceipt.ReleaseLock();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/300880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刚刚!华为mate30 pro全球首发,三星黯然失色,iPhone11甚至都被吓降价了

全世界只有3.14 % 的人关注了青少年数学之旅众望所归&#xff0c;9月19日&#xff0c;华为在德国慕尼黑发布了Mate30系列。看完发布会&#xff0c;数据汪给大家总结了几个看点&#xff1a;1.全球一样的版本本次华为mate30系列采用的是EMUI 10系统&#xff0c;不会搭载谷歌旗下的…

c语言埃尔米特插值思路,【数学建模算法】(26)插值和拟合:埃尔米特(Hermite)插值和样条插值...

1.埃尔米特(Hermite)插值1.1.Hermite插值多项式如果对插值函数&#xff0c;不仅要求它在节点处与函数同值&#xff0c;而且要求它与函数有相同的一阶、二阶甚至更高阶的导数值&#xff0c;这就是 Hermite 插值问题。本节主要讨论在节点处插值函数与函数的值及一阶导数值均相等的…

剖析XAML语言

这节剖析一下XAML(读作&#xff1a;zaml)——这一WPF中的UI设计语言。XAML在wpf中&#xff0c;UI部分使用xaml语言来编写&#xff0c;xaml语言是由xml语言派生而来的语言&#xff0c;所以在xaml中我们可以看到很多熟悉的特点&#xff1a;它也是使用标签构建页面&#xff0c;一个…

中国最神秘的一所大学,它只存在过8年,却成了永远的第一

全世界只有3.14 % 的人关注了青少年数学之旅本文授权转载于公众号&#xff1a;物道精致生活&#xff08;wudaojieqi&#xff09;&#xff0c;转载请联系物道中国曾经有过这么一所大学&#xff1a;在抗日战争中仓促搭起&#xff0c;被称为“史上最穷”&#xff0c;校舍破旧得梁思…

ibatise 没有大于等于吗_库里+杜兰特并没有大于等于2!或许他和库里搭配将更强...

NBA历史风卷云涌&#xff0c;巨星层出不穷&#xff0c;就算是称霸一时的巨星组合亦是多不胜数。默契的魔术师与贾巴尔&#xff0c;强悍的斯托克顿与马龙&#xff0c;绝对统治的乔丹与皮蓬&#xff0c;飞天遁地的科比与奥尼尔。就算是近十年&#xff0c;有如韦德与詹姆斯&#x…

一句话征服了美国人,这位饱受争议的数学博士竟从未上过学?

全世界只有3.14 % 的人关注了青少年数学之旅前两天&#xff0c;有位不愿意透露姓名的模友问了超模君一个问题&#xff1a;虽然这个问题超模君已经解答过无数遍了&#xff0c;但看到模友如此虔诚的态度&#xff0c;超模君决定今天再给模友们讲一个犹太小伙用数学征服美国军官的故…

使用 C# 开发浏览器扩展

使用 C# Blazor 开发浏览器扩展Intro前段时间听了 Justin 大佬分享的 Blazor 开发浏览器扩展&#xff0c;觉得很不错&#xff0c;C# 可以做更多有趣的事情了&#xff0c;很多需要在服务器端做的事情可能就可以在客户端里实现了&#xff0c;而且高度可以复用已有的 C# 代码&…

一个设置ip的vbs脚本

经常在两个网段间转换 常改ip&#xff0c;找了一个改ip的脚本稍微改了一下&#xff0c;让他适合我的情况&#xff08;自动判断我的ip&#xff09;strComputer "."SetobjWMIService GetObject("winmgmts:\\"&strComputer &"\root\cimv2")…

心动的本质是什么_《心动的信号3》:在“烟火气”里嗑糖,素人恋爱究竟有多上头?...

文 | 土豆2018年&#xff0c;一档画风清新&#xff0c;以素人恋爱为主体、辅之以明星观察为核心的恋爱社交真人秀节目&#xff0c;走红于市场。彼时国内综艺市场&#xff0c;尚且还处于竞技类真人秀、偶像综艺的爆发期——《心动的信号》播出以后&#xff0c;不仅成功开启了国内…

android 如何动态设置margin,Android 动态设置margin

android的view中有setPadding&#xff0c;但是没有直接的setMargin方法。如果要在代码中设置该怎么做呢&#xff1f;可以通过设置view里面的LayoutParams设置&#xff0c;而这个LayoutParams是根据该view在不同的GroupView而不同的。布局文件如下:xmlns:tools"http://sche…

老是担心数学学不好?是因为你的数学老师不是爱因斯坦!

各位模友&#xff0c;大家好我是小木相信上学的时候&#xff0c;数学对于很多人来说&#xff0c;无疑是个坑&#xff01;好不容易毕业了&#xff0c;好奇又好学的小表妹每次都能完美地引起小木的心酸历程。就在小木一边回忆起自己的心酸历程的同时&#xff0c;不禁感叹&#xf…

oracle 产看执行计划_ODBA 技能SPM计划

OBA技能1-获取执行计划OBA技能2-执行计划顺序OBA技能&#xff13;-执行计划顺序表连接ODBA 技能&#xff14;实战执行计划ODBA 技能5 固定执行计划因为每次统计信息作业在收集完信息后&#xff0c;会触发ACS自适应游标管理程序&#xff0c;进行对绑定变量的窥探工作&#xff0c…

android动画设置的单位,Kotlin语言入门—实现单位转换,view设置,动画等

dp转换为px在android开发中&#xff0c;dp sp px之间的转换是不可避免的&#xff0c;在使用java语言开发时&#xff0c;往往会做个工具类进项转化。这样的工具类在网上很多&#xff0c;这里就不在展示了。如果使用Kotlin语言开发&#xff0c;则可以通过通过Extension来优雅的解…

微软面向初学者的机器学习课程:1.1-机器学习介绍

写在前面&#xff1a;最近在参与microsoft/ML-For-Beginners的翻译活动&#xff0c;欢迎有兴趣的朋友加入&#xff08;https://github.com/microsoft/ML-For-Beginners/issues/71&#xff09;机器学习介绍![机器学习&#xff0c;人工智能&#xff0c;深度学习-有什么区别?](ht…

遭央视曝光的“AI算命”,背后竟然隐藏了一个价值千亿的市场!?

全世界只有3.14 % 的人关注了青少年数学之旅还记得儿时算命先生曾对我说&#xff1a;等你25岁那年&#xff0c;会黄袍加身&#xff0c;每天与大鱼大肉为伍。如今眼看着25逐步逼近&#xff0c;数据汪看到美团的外卖小哥都有种莫名的“亲切感”。爆红的“AI算命”言归正传&#x…

微软面向初学者的机器学习课程:1.2-机器学习的历史

写在前面&#xff1a;最近在参与microsoft/ML-For-Beginners的翻译活动&#xff0c;欢迎有兴趣的朋友加入&#xff08;https://github.com/microsoft/ML-For-Beginners/issues/71&#xff09;机器学习的历史作者Tomomi Imura[1]课前测验[2]在本课中&#xff0c;我们将走过机器学…

android布局中画圆角矩形,Android 自定义View之圆角矩形轨迹图

一、原理说明主要是通过计算轨迹的坐标点加入到集合中&#xff0c;然后对集合进行相应截取&#xff0c;传入canvas中。二、具体代码实现/*** 原理是先通过尺寸把各个轨迹的坐标计算出来&#xff0c;然后再截取相应坐标&#xff0c;进行重绘。** author lz* Time 2019-3-27*/pub…

类QQ右下角弹出框(Qt)

2019独角兽企业重金招聘Python工程师标准>>> 使用Qt写的类QQ右下角弹出框 /***main.cpp */ #include <QtGui/QApplication> #include "dialog.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);Dialog w;w.show();return a.exec()…

实现贝叶斯分类器_机器学习实战项目-朴素贝叶斯

朴素贝叶斯 概述贝叶斯分类是一类分类算法的总称&#xff0c;这类算法均以贝叶斯定理为基础&#xff0c;故统称为贝叶斯分类。本章首先介绍贝叶斯分类算法的基础——贝叶斯定理。最后&#xff0c;我们通过实例来讨论贝叶斯分类的中最简单的一种: 朴素贝叶斯分类。贝叶斯理论 &a…

设计模式(1)

一、 C# 面向对象程序设计复习 点击http://files.cnblogs.com/zhenyulu/CSharp.rar下载&#xff0c;内容包括&#xff1a; 字段与属性.cs 属性、方法作用范围.cs 一加到一百.cs 使用接口排序(2).cs 使用接口排序(1).cs 求质数.cs 冒泡法排序.cs 九九表.cs 静态与非静态…