quartz-scheduler導(dǎo)致InnoDB deadlock

最近項目中使用spring+quartz的方式來實現(xiàn)跑批任務(wù),偶然發(fā)現(xiàn)日志中存在InnoDB中deadlock,排查一番真是廢了很多精力。

  • 先上一炮異常:
2016-08-15 14:51:06.136 [QuartzScheduler_scheduler-WilliamLee1471243617837_ClusterManager] ERROR jdbc.sqlonly - 109. PreparedStatement.executeUpdate() INSERT INTO QRTZ_SCHEDULER_STATE (SCHED_NAME, INSTANCE_NAME, LAST_CHECKIN_TIME, CHECKIN_INTERVAL) VALUES('scheduler', 'WilliamLee1471243617837', 1471243866096, 10000)

com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
---
blablabla
---
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.clusterCheckIn(JobStoreSupport.java:3401) [quartz-2.2.1.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.doCheckin(JobStoreSupport.java:3253) [quartz-2.2.1.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.manage(JobStoreSupport.java:3858) [quartz-2.2.1.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$ClusterManager.run(JobStoreSupport.java:3895) [quartz-2.2.1.jar:na]

quartz-scheduler中集群模式是通過數(shù)據(jù)庫來交互的,我們使用的是mysql,默認(rèn)的事務(wù)隔離級別是rr,在框架中用來維護(hù)scheduler的類是ClusterManager,看報錯信息是這個類的clusterCheckIn方法執(zhí)行的時候發(fā)生死鎖。

  • 解析下clusterCheckIn()干什么了?
    先從它的上一層方法說doCheckin(),關(guān)鍵代碼。
Connection conn = getNonManagedTXConnection();
if (!firstCheckIn) {    
    failedRecords = clusterCheckIn(conn);    
    commitConnection(conn);
}
failedRecords = (firstCheckIn) ? clusterCheckIn(conn) : findFailedInstances(conn);
clusterRecover(conn, failedRecords);

首先拿到一個autocommit=false的Connection,然后執(zhí)行clusterCheckIn(),返回failedRecords,最后會在clusterRecover()刪除掉這些failedRecords。接下來看看clusterCheckIn()。

lastCheckin = System.currentTimeMillis();
if(getDelegate().updateSchedulerState(conn, getInstanceId(), lastCheckin) == 0) {    
     getDelegate().insertSchedulerState(conn, getInstanceId(), lastCheckin, getClusterCheckinInterval());
}

update如果返回結(jié)果為0條,那就insert這條記錄。死鎖就是發(fā)生在這個地方。
當(dāng)在debug的時候,我先提交一個update語句,但是這條語句并未命中,在rr事務(wù)隔離級別中這會觸發(fā)gap鎖,防止其他事務(wù)中進(jìn)行插入。這時其他線程(例如其他節(jié)點)同樣會執(zhí)行這段代碼,先提交update語句,同樣觸發(fā)gap鎖,gap與gap相互兼容,這時無論哪個線程提交insert語句之后都會阻塞,當(dāng)?shù)诙€線程提交insert之后就會發(fā)生死鎖,事務(wù)1希望事務(wù)2釋放gap讓自己完成insert操作,事務(wù)2希望事務(wù)1釋放gap讓自己完成insert操作。
我個人覺得這個問題quartz框架并沒有解決,只是在正常情況下不容易出現(xiàn),這個bug在1.8.4中被提出過(bug鏈接) 查看源碼發(fā)現(xiàn)解決的辦法就是再執(zhí)行過程中進(jìn)行了一次commit。

failedRecords = clusterCheckIn(conn);
commitConnection(conn);
  • 解決辦法
    將數(shù)據(jù)庫的默認(rèn)隔離級別修改成rc,不存在gap鎖,就不會出現(xiàn)這種問題。
    另外我們這個情況是因為在開發(fā)環(huán)境debug,導(dǎo)致線程全部阻塞,增加了發(fā)生死鎖的概率,最后把debug級別修改成thread后就沒在發(fā)生過.

以上是粗讀quartz-scheduler源碼總結(jié),如果有錯誤的地方歡迎指點。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,746評論 2 370

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