解決@Transactional不能跨線程池共享事務(wù)的問題—使用TransmittableThreadLocal

1. @Transactional不能跨線程池共享事務(wù)

兩個(gè)加了@Transactional注解的數(shù)據(jù)庫查詢方法:

  1. TestTransactionalConsumerService.testDemoUser()
  2. TestTransactionalProviderService.testDemoUser()

前者通過線程池調(diào)用后者村刨。
主要代碼如下:
TestTransactionalConsumerService:

@Transactional
public void testDemoUser() {
    Page<DemoUser> page = new Page<>(1, 10);
    IPage<DemoUser> userList = demoUserMapper.selectPage(page, new ueryWrapper<DemoUser>().lambda().eq(DemoUser::getAge, 24));
    userList.getRecords().forEach(System.out::println);
    CompletableFuture.runAsync(() -> testTransactionalProviderService.testDemoUser(), ttlThreadPool);
}

TestTransactionalProviderService:

@Transactional
public void testDemoUser() {
    Page<DemoUser> page = new Page<>(1, 10);
    IPage<DemoUser> userList = demoUserMapper.selectPage(page, new ueryWrapper<DemoUser>().lambda().eq(DemoUser::getAge, 18));
    userList.getRecords().forEach(System.out::println);
}

數(shù)據(jù)庫查詢 1 在主線程症脂,數(shù)據(jù)庫查詢 2 是主線程在線程池中調(diào)用。
MySQL日志如下(省略了了無關(guān)的一些日志):

2021-10-06T13:15:03.723491Z    17 Query SET autocommit=0
2021-10-06T13:15:03.847866Z    17 Query SELECT COUNT(*) AS total FROM demo_user WHERE (age = 24)
2021-10-06T13:15:03.877622Z    17 Query SELECT  id,name,age,email  FROM demo_user WHERE (age = 24) LIMIT 10
2021-10-06T13:15:03.907605Z    18 Query SET autocommit=1
2021-10-06T13:15:03.907852Z    18 Query SET autocommit=0
2021-10-06T13:15:03.921955Z    18 Query SELECT COUNT(*) AS total FROM demo_user WHERE (age = 18)
2021-10-06T13:15:03.939692Z    18 Query SELECT  id,name,age,email  FROM demo_user WHERE (age = 18) LIMIT 10
2021-10-06T13:15:03.941746Z    18 Query commit
2021-10-06T13:15:03.942005Z    18 Query SET autocommit=1
2021-10-06T13:15:05.912507Z    17 Query commit
2021-10-06T13:15:05.912896Z    17 Query SET autocommit=1

查詢 1 和 查詢 2 分別開啟了一個(gè)事務(wù)侣诺,并不在同一個(gè)事務(wù)中。我們最開始對(duì)@Transactional注解理解不足時(shí)可能會(huì)誤以為這兩個(gè)查詢?cè)谕粋€(gè)事務(wù)中谬运,從而出現(xiàn)預(yù)想之外的結(jié)果离福。

2. 一種實(shí)驗(yàn)性的解決方法

@Transactional注解中保存數(shù)據(jù)庫連接使用的是NamedThreadLocal,下載 spring 的源碼使用TransmittableThreadLocal代替ThreadLocal重寫spring-core中的NamedThreadLocal類澡屡,重新打包后替換掉springboot工程中的spring-core猿挚。詳見這里:使用TransmittableThreadLocal替換Thread Local重新打包spring。同時(shí)使用ttl線程池替換普通線程池驶鹉。MySQL日志如下:

2021-10-06T13:16:22.207792Z    19 Query SET autocommit=0
2021-10-06T13:16:22.335394Z    19 Query SELECT COUNT(*) AS total FROM demo_user WHERE (age = 24)
2021-10-06T13:16:22.366691Z    19 Query SELECT  id,name,age,email  FROM demo_user WHERE (age = 24) LIMIT 10
2021-10-06T13:16:22.433475Z    19 Query SELECT COUNT(*) AS total FROM demo_user WHERE (age = 18)
2021-10-06T13:16:22.451351Z    19 Query SELECT  id,name,age,email  FROM demo_user WHERE (age = 18) LIMIT 10
2021-10-06T13:16:24.409886Z    19 Query commit
2021-10-06T13:16:24.410713Z    19 Query SET autocommit=1

可以看到绩蜻,兩個(gè)查詢使用的是同一個(gè)數(shù)據(jù)庫事務(wù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末室埋,一起剝皮案震驚了整個(gè)濱河市办绝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姚淆,老刑警劉巖孕蝉,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肉盹,居然都是意外死亡昔驱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門上忍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骤肛,“玉大人,你說我怎么就攤上這事窍蓝∫傅撸” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵吓笙,是天一觀的道長淑玫。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么絮蒿? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任尊搬,我火速辦了婚禮,結(jié)果婚禮上土涝,老公的妹妹穿的比我還像新娘佛寿。我一直安慰自己,他們只是感情好但壮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布冀泻。 她就那樣靜靜地躺著,像睡著了一般蜡饵。 火紅的嫁衣襯著肌膚如雪弹渔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天溯祸,我揣著相機(jī)與錄音肢专,去河邊找鬼。 笑死您没,一個(gè)胖子當(dāng)著我的面吹牛鸟召,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氨鹏,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼欧募,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了仆抵?” 一聲冷哼從身側(cè)響起跟继,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镣丑,沒想到半個(gè)月后舔糖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莺匠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年金吗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趣竣。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摇庙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遥缕,到底是詐尸還是另有隱情卫袒,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布单匣,位于F島的核電站夕凝,受9級(jí)特大地震影響宝穗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜码秉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一逮矛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泡徙,春花似錦橱鹏、人聲如沸膜蠢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挑围。三九已至礁竞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杉辙,已是汗流浹背模捂。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜘矢,地道東北人狂男。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像品腹,于是被迫代替她去往敵國和親岖食。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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