MySQL 5.6 5.7 如何自定義行鎖超時等待(wait timeout)時間 innodb_lock_wait_timeout

1. 問題

最近由于業(yè)務(wù)的需要冬竟,寫了個基于數(shù)據(jù)庫鎖機(jī)制的分布式調(diào)度簡易框架,用于處理業(yè)務(wù)中的補(bǔ)償任務(wù)和定時輪詢?nèi)蝿?wù)卦溢。由于調(diào)度任務(wù)處理時間長短不一糊余,有些是幾秒處理完,而有些需要好幾分鐘单寂。對于處理時間較長的任務(wù)贬芥,在事務(wù)中,行鎖會一直占據(jù)直到事務(wù)處理結(jié)束宣决。

那么問題就來了蘸劈,對于時間處理較長的任務(wù),再下一輪調(diào)度起來之前事務(wù)還沒處理完疲扎,這個時候昵时,下個事務(wù)會在行鎖上一直等待下去捷雕,直到timeout椒丧。這樣會占據(jù)多個線程、消耗多數(shù)數(shù)據(jù)庫資源救巷。

2. 解決思路壶熏、方案

思路也很簡單,當(dāng)檢測到數(shù)據(jù)庫行鎖被占據(jù)時浦译,當(dāng)前線程立馬結(jié)束棒假,不進(jìn)行鎖釋放等待,這樣既節(jié)約線程資源也節(jié)省數(shù)據(jù)庫資源精盅。

我們知道帽哑,MySQL8是支持 'SELECT ... for update NOWAIT' 這種寫法的,但是對于5.x版本這種寫法并不支持(圖 - 1)叹俏,恰巧我們用的是5.6版本妻枕,我們需要另外想辦法來解決。

圖 - 1

思路1: 在MYSQL系統(tǒng)變量里面(global variable, session variable)中有特定的變量用來控制這個行鎖超時等待時間粘驰,我們可以修改這變量值屡谐,來使得我們的等待超時時間縮短

思路2: 比較好的方案,我們只修改當(dāng)前會話的蝌数,而不修改全局變量值(有可能多個程序在連你的數(shù)據(jù)庫)

思路3: 到底哪個變量控制這行鎖的超時等待時間呢愕掏?通過網(wǎng)上查詢,我們可以知道有一個叫 'innodb_lock_wait_timeout' 的變量正是我們要尋找的東東顶伞。 MySQL對于超時相關(guān)的變量有很多饵撑,大家可以查詢information_scheme.global/session_variables表 (5.7版本略微不同剑梳,需要在performance_schema去查詢):

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

你會看到有很多相關(guān)的變量,每個變量的含義肄梨,大家可以網(wǎng)上查找一下阻荒,了解一下很有必要!众羡!這里我們只關(guān)心 「innodb_lock_wait_timeout」這個變量侨赡,默認(rèn)值是 50秒,表示: 行鎖等待超時時間是50秒粱侣。

圖 - 2

好了羊壹,問題根源我們也找到,現(xiàn)在的問題是怎么做齐婴?油猫!

思路1:數(shù)據(jù)庫的操作流程其實(shí)也挺直接明了的:

定義DataSource -> 從DS池中獲取Connection -> 通過connection執(zhí)行SQL

涉及到事務(wù)的,其實(shí)也就是在第二步獲取connection后在執(zhí)行第三部前柠偶,執(zhí)行事務(wù)相關(guān)操作(在動態(tài)代理中)情妖,比如:執(zhí)行 begin語句(start transaction語句效果也一樣)

思路2:我們能否在Connection創(chuàng)建的時候,就把 innodb_lock_wait_timeout的值給修改了呢诱担?答案是可以的毡证。

Springboot中默認(rèn)的數(shù)據(jù)庫連接池用的是 Hikari,而它剛好有可配置屬性:connectionInitSql蔫仙,通過代碼跟蹤料睛,可以知道這個SQL在創(chuàng)建connection的時候會被執(zhí)行。這個正好是我們想要的R“睢P羯贰!施籍!好了居扒,其他不多說了,上代碼吧3笊鳌喜喂!

通過 SET語句,我們可以設(shè)置SESSION級別的值(圖 - 3)

圖 - 3

3. 測試用例

圖 - 4

4. 總結(jié)

這個問題立哑,項(xiàng)目中存在有一段時間了夜惭,一直都沒有時間沉下心來研究,這周趁著項(xiàng)目空閑期終于搞出了這個方案铛绰,下周上線诈茧,線上觀察一段時間。

5. 附圖

有同學(xué)問及到有關(guān)方法的代碼捂掰,現(xiàn)黏貼一下:

lockAgain()方法

附圖1

lockRowFor1000Seconds()方法

附圖2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敢会,一起剝皮案震驚了整個濱河市曾沈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸥昏,老刑警劉巖塞俱,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吏垮,居然都是意外死亡障涯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門膳汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唯蝶,“玉大人,你說我怎么就攤上這事遗嗽≌澄遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵痹换,是天一觀的道長征字。 經(jīng)常有香客問我,道長娇豫,這世上最難降的妖魔是什么匙姜? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮锤躁,結(jié)果婚禮上搁料,老公的妹妹穿的比我還像新娘或详。我一直安慰自己系羞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布霸琴。 她就那樣靜靜地躺著椒振,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梧乘。 梳的紋絲不亂的頭發(fā)上澎迎,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音选调,去河邊找鬼夹供。 笑死,一個胖子當(dāng)著我的面吹牛仁堪,可吹牛的內(nèi)容都是我干的哮洽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼弦聂,長吁一口氣:“原來是場噩夢啊……” “哼鸟辅!你這毒婦竟也來了氛什?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匪凉,失蹤者是張志新(化名)和其女友劉穎枪眉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體再层,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸铜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了聂受。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萨脑。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饺饭,靈堂內(nèi)的尸體忽然破棺而出渤早,到底是詐尸還是另有隱情,我是刑警寧澤瘫俊,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布鹊杖,位于F島的核電站,受9級特大地震影響扛芽,放射性物質(zhì)發(fā)生泄漏骂蓖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一川尖、第九天 我趴在偏房一處隱蔽的房頂上張望登下。 院中可真熱鬧,春花似錦叮喳、人聲如沸被芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽畔濒。三九已至,卻和暖如春锣咒,著一層夾襖步出監(jiān)牢的瞬間侵状,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工毅整, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趣兄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓悼嫉,卻偏偏與公主長得像艇潭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一暴区、概述 數(shù)據(jù)庫鎖定機(jī)制簡單來說闯团,就是數(shù)據(jù)庫為了保證數(shù)據(jù)的一致性,而使各種共享資源在被并發(fā)訪問變得有序所設(shè)計(jì)的一種...
    不變甄心閱讀 2,736評論 0 3
  • https://blog.csdn.net/steven_liwen/article/details/531884...
    SkTj閱讀 2,375評論 0 16
  • 今天看到一位朋友寫的mysql筆記總結(jié)仙粱,覺得寫的很詳細(xì)很用心房交,這里轉(zhuǎn)載一下,供大家參考下伐割,也希望大家能關(guān)注他原文地...
    信仰與初衷閱讀 4,732評論 0 30
  • 文章導(dǎo)讀: 累兮候味,累兮,要死兮...... 本文解決問題: 1隔心、表級鎖定(讀鎖白群、寫鎖) 2、行級鎖定(共享鎖硬霍、排他...
    創(chuàng)造new_world閱讀 640評論 0 1
  • 最近碰到幾個業(yè)務(wù)場景帜慢,會遇到并發(fā)的問題。在單實(shí)例情況下唯卖,我們會通過java.util.concurrent包...
    菜鳥小玄閱讀 2,254評論 0 5