MySQL 5.6 5.7 如何自定义行锁超时等待(wait timeout)时间 innodb_lock_wait_timeout

1. 问题

最近由于业务的需要,写了个基于数据库锁机制的分布式调度简易框架,用于处理业务中的补偿任务和定时轮询任务。由于调度任务处理时间长短不一,有些是几秒处理完,而有些需要好几分钟。对于处理时间较长的任务,在事务中,行锁会一直占据直到事务处理结束。

那么问题就来了,对于时间处理较长的任务,再下一轮调度起来之前事务还没处理完,这个时候,下个事务会在行锁上一直等待下去,直到timeout。这样会占据多个线程、消耗多数数据库资源。

2. 解决思路、方案

思路也很简单,当检测到数据库行锁被占据时,当前线程立马结束,不进行锁释放等待,这样既节约线程资源也节省数据库资源。

我们知道,MySQL8是支持 'SELECT ... for update NOWAIT' 这种写法的,但是对于5.x版本这种写法并不支持(图 - 1),恰巧我们用的是5.6版本,我们需要另外想办法来解决。

图 - 1

思路1: 在MYSQL系统变量里面(global variable, session variable)中有特定的变量用来控制这个行锁超时等待时间,我们可以修改这变量值,来使得我们的等待超时时间缩短

思路2: 比较好的方案,我们只修改当前会话的,而不修改全局变量值(有可能多个程序在连你的数据库)

思路3: 到底哪个变量控制这行锁的超时等待时间呢?通过网上查询,我们可以知道有一个叫 'innodb_lock_wait_timeout' 的变量正是我们要寻找的东东。 MySQL对于超时相关的变量有很多,大家可以查询information_scheme.global/session_variables表 (5.7版本略微不同,需要在performance_schema去查询):

select * from information_schema.global_variables where variable_name like '%timeout%';

你会看到有很多相关的变量,每个变量的含义,大家可以网上查找一下,了解一下很有必要!!这里我们只关心 「innodb_lock_wait_timeout」这个变量,默认值是 50秒,表示: 行锁等待超时时间是50秒。

图 - 2

好了,问题根源我们也找到,现在的问题是怎么做?!

思路1:数据库的操作流程其实也挺直接明了的:

定义DataSource -> 从DS池中获取Connection -> 通过connection执行SQL

涉及到事务的,其实也就是在第二步获取connection后在执行第三部前,执行事务相关操作(在动态代理中),比如:执行 begin语句(start transaction语句效果也一样)

思路2:我们能否在Connection创建的时候,就把 innodb_lock_wait_timeout的值给修改了呢?答案是可以的。

Springboot中默认的数据库连接池用的是 Hikari,而它刚好有可配置属性:connectionInitSql,通过代码跟踪,可以知道这个SQL在创建connection的时候会被执行。这个正好是我们想要的!!!!好了,其他不多说了,上代码吧!!

通过 SET语句,我们可以设置SESSION级别的值(图 - 3)

图 - 3

3. 测试用例

图 - 4

4. 总结

这个问题,项目中存在有一段时间了,一直都没有时间沉下心来研究,这周趁着项目空闲期终于搞出了这个方案,下周上线,线上观察一段时间。

5. 附图

有同学问及到有关方法的代码,现黏贴一下:

lockAgain()方法

附图1

lockRowFor1000Seconds()方法

附图2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容

  • 一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种...
    不变甄心阅读 2,733评论 0 3
  • https://blog.csdn.net/steven_liwen/article/details/531884...
    SkTj阅读 2,369评论 0 16
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,729评论 0 30
  • 文章导读: 累兮,累兮,要死兮...... 本文解决问题: 1、表级锁定(读锁、写锁) 2、行级锁定(共享锁、排他...
    创造new_world阅读 640评论 0 1
  • 最近碰到几个业务场景,会遇到并发的问题。在单实例情况下,我们会通过java.util.concurrent包...
    菜鸟小玄阅读 2,253评论 0 5