国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

線上問題事跡(一)數(shù)據(jù)庫事務居然都沒生效?

數(shù)據(jù)庫
Spring聲明式事務提供給 Javaer 們方便的事務配置方式,再搭配Spring Boot自動配置,基本只需在方法上添加@Transactional注解,即可瞬間開啟方法的事務性配置。

[[352574]]

Spring聲明式事務提供給 Javaer 們方便的事務配置方式,再搭配Spring Boot自動配置,基本只需在方法上添加@Transactional注解,即可瞬間開啟方法的事務性配置。

  • 但僅為方法添加@Transactional注解

你就以為這就夠了嗎?

事務未被正確處理,一般不會導致停止服務,更不易在測試階段復現(xiàn)。但隨系統(tǒng)業(yè)務越來越復雜,就會帶來大量數(shù)據(jù)不一致問題,隨后就是大量線上問題而后人工排查檢修數(shù)據(jù)。

1 你的Spring事務怎么才算生效?

使用@Transactional開啟聲明式事務時, 靈魂發(fā)問:事務生效了嗎?

案例

用戶表實體類

 

DAO 層 

根據(jù)username查詢所有數(shù)據(jù)

  1. @Repository 
  2. public interface UserRepository extends JpaRepository<UserEntity, Long> { 
  3.     List<UserEntity> findByName(String name); 

Service層

UserService類

負責業(yè)務邏輯處理,包括如下方法:

createUserWrong1調用private方法:

createUserPrivate,被@Transactional注解。當傳入的用戶名包含test則拋異常,讓用戶的創(chuàng)建操作失敗,期望事務回滾: 


getUserCount

 

Controller層 

調用一下剛才定義的UserService中的入口方法createUserWrong1。 


測試結果

即便用戶名不合法,用戶也能創(chuàng)建成功。刷新瀏覽器,多次發(fā)現(xiàn)非法用戶注冊。

2 @Transactional怎么確保生效?

除非特殊配置(比如使用AspectJ靜態(tài)織入實現(xiàn)AOP),否則只有定義在public方法上的@Transactional才能生效。

Spring默認通過動態(tài)代理實現(xiàn)AOP,對目標方法增強,private方法無法代理到,自然也無法動態(tài)增強事務處理邏輯。

那簡單,把createUserPrivate方法改為public即可。

在UserService中再建一個入口方法createUserWrong2,來調用這個public方法再次嘗試:

  1. public int createUserWrong2(String name) { 
  2.     try { 
  3.         this.createUserPublic(new UserEntity(name)); 
  4.     } catch (Exception ex) { 
  5.         log.error("create user failed because {}", ex.getMessage()); 
  6.     } 
  7.     return userRepository.findByName(name).size(); 
  8.  
  9. //標記了@Transactional的public方法 
  10. @Transactional 
  11. public void createUserPublic(UserEntity entity) { 
  12.     userRepository.save(entity); 
  13.     if (entity.getName().contains("test")) 
  14.         throw new RuntimeException("invalid username!"); 

新的createUserWrong2方法事務同樣不生效。

必須通過代理過的類從外部調用目標方法

要調用增強過的方法必然是調用代理后的對象。

嘗試修改UserService,注入一個self,然后再通過self實例調用標記有@Transactional注解的createUserPublic方法。設置斷點可以看到,self是由Spring通過CGLIB方式增強過的類。

CGLIB通過繼承方式實現(xiàn)代理類,private方法在子類不可見,自然也就無法進行事務增強;

this指針代表對象自己,Spring不可能注入this,所以通過this訪問方法必然不是代理。

把this改為self,在Controller中調用createUserRight方法可以驗證事務生效了:非法的用戶注冊操作可以回滾。

雖然在UserService內部注入自己調用自己的createUserPublic可以正確實現(xiàn)事務,但這不符合習慣用法。更合理的實現(xiàn)方式是,讓Controller直接調用之前定義的UserService的createUserPublic方法。

  1. @GetMapping("right2"
  2. public int right2(@RequestParam("name") String name) { 
  3.     try { 
  4.         userService.createUserPublic(new UserEntity(name)); 
  5.     } catch (Exception ex) { 
  6.         log.error("create user failed because {}", ex.getMessage()); 
  7.     } 
  8.     return userService.getUserCount(name); 

this自調用/self調用/Controller調用UserService


  • this自調用

          無法走到Spring代理類

  • 后兩種

          調用的Spring注入的UserService,通過代理調用才有機會對createUserPublic方法進行動態(tài)增強。

推薦在開發(fā)時打開相關Debug日志,以了解Spring事務實現(xiàn)的細節(jié)。

比如JPA數(shù)據(jù)庫訪問,可以這么開啟Debug日志:

logging.level.org.springframework.orm.jpa=DEBUG

開啟日志后再比較下在UserService中this調用、Controller中通過注入的UserService Bean調用createUserPublic的區(qū)別。

很明顯,this調用因沒走代理,事務沒有在createUserPublic生效,只在Repository的save生效:

  1. // 在UserService中通過this調用public的createUserPublic 
  2. [23:04:30.748] [http-nio-45678-exec-5] [DEBUG] [o.s.orm.jpa.JpaTransactionManager:370 ] -  
  3. Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]:  
  4. PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
  5.  
  6. [DEBUG] [o.s.orm.jpa.JpaTransactionManager       :370 ] - Creating new transaction with name [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
  7. //在Controller中通過注入的UserService Bean調用createUserPublic 
  8. [10:10:47.750] [http-nio-45678-exec-6] [DEBUG] [o.s.orm.jpa.JpaTransactionManager       :370 ] - Creating new transaction with name [org.geekbang.time.commonmistakes.transaction.demo1.UserService.createUserPublic]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 

這種實現(xiàn)在Controller里處理異常顯得繁瑣,還不如直接把createUserWrong2加@Transactional注解,然后在Controller中直接調用該方法。

這既能從外部(Controller中)調用UserService方法,方法又是public的能夠被動態(tài)代理AOP增強。要不你試試?看看效果如何,下回分解~

 

責任編輯:姜華 來源: JavaEdge
相關推薦

2020-11-18 10:16:52

數(shù)據(jù)庫回滾事務

2020-11-18 08:32:07

數(shù)據(jù)庫

2019-04-15 13:15:12

數(shù)據(jù)庫MySQL死鎖

2024-06-21 09:37:57

2010-10-08 09:38:55

Android數(shù)據(jù)庫事

2009-09-24 14:12:22

Hibernate數(shù)據(jù)

2025-04-08 06:00:00

2024-05-28 00:00:30

Golang數(shù)據(jù)庫

2020-06-17 16:56:36

數(shù)據(jù)庫MySQL跨行事務

2017-08-22 17:10:45

數(shù)據(jù)庫MySQL事務模型

2019-05-13 08:24:58

數(shù)據(jù)庫MySQLInnoDB

2021-10-03 15:00:44

數(shù)據(jù)庫mysql單機

2020-08-20 07:37:21

數(shù)據(jù)庫開源框架

2018-09-06 14:53:39

數(shù)據(jù)庫事務隔離隔離級別

2010-05-31 15:12:44

MySQL數(shù)據(jù)庫

2022-08-01 20:29:48

分布式架構數(shù)據(jù)

2023-10-11 08:09:53

事務隔離級別

2018-07-20 11:10:21

數(shù)據(jù)庫事務隔離性

2009-08-06 18:10:06

C#數(shù)據(jù)庫事務

2011-08-12 13:33:31

Oracle數(shù)據(jù)庫自治事務
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久麻豆一区软件| 日韩精品色哟哟| 亚洲国产一区二区三区在线观看| 在线国产福利网站| 欧美高清在线视频| 在线观看视频一区二区欧美日韩| 野外做受又硬又粗又大视频√| 欧美日韩国产高清| 国产精品女主播| 日韩av三区| 欧美成人一区在线| 成人在线高清| 日韩三级成人av网| 欧洲精品久久久久毛片完整版| 精品999在线播放| 大胆av不用播放器在线播放| 一本色道久久综合狠狠躁的推荐| 色吊丝在线永久观看最新版本| 亚洲一区二区中文在线| 青檬在线电视剧在线观看| 亚洲一区二区三区中文字幕| 好男人社区在线视频| 亚洲欧美国产毛片在线| 久草在线新视觉| 天天色天天操综合| 国产精品久久久久免费a∨大胸| 老司机成人在线| 日韩av免费看| 亚洲国产不卡| 久久精品国产综合精品| 国产精品女主播一区二区三区| 国产精品久久精品视| 国产精品日韩久久久| 日韩av大全| 高清av一区二区| 亚洲免费av一区二区三区| 亚洲日本护士毛茸茸| 青青草在线视频免费观看| 欧美丝袜自拍制服另类| 欧美亚洲天堂| 久久精品一偷一偷国产| 日韩欧美国产大片| 91成人免费观看| 蜜桃视频在线观看一区二区| 国产主播自拍av| 亚洲精品中文在线影院| a中文在线播放| 亚洲欧美中文日韩在线v日本| 九九久久国产| 国产欧美在线视频| 美女网站视频久久| 三年中国国语在线播放免费| 91九色鹿精品国产综合久久香蕉| 欧美激情亚洲精品| 亚洲91精品| 日韩精品手机在线观看| 国产精品久久久久天堂| 国产综合视频一区二区三区免费| 亚洲第一综合天堂另类专| 美国十次综合久久| 亚洲最大福利视频网站| 国产成人综合在线| 欧美12一14sex性hd| 亚洲国产第一页| 啄木系列成人av电影| 欧美日韩大片一区二区三区| 久久青草欧美一区二区三区| 伦理片一区二区三区| 中文日韩在线视频| 亚洲成人日韩| 久在线观看视频| 色婷婷av一区二区三区之一色屋| 九九热线视频只有这里最精品| 国产精品啪视频| 国产一区二区视频在线| 宅男宅女性影片资源在线1| 亚洲第一在线视频| 少妇精品久久久| 先锋影音男人资源| 欧美午夜视频在线观看| 国产成人免费av一区二区午夜| 成人黄色在线免费观看| 久久久不卡网国产精品二区| 免费高清完整在线观看| 97视频在线看| 极品美女销魂一区二区三区免费| 日本aⅴ写真网站免费| 国产亚洲精品va在线观看| 欧美日本一区二区视频在线观看| www一区二区www免费| 欧美性色综合网| 伊甸园亚洲一区| 天堂8在线天堂资源bt| 欧美日韩一区三区四区| 91xxx在线观看| 国产成人中文字幕| 激情欧美国产欧美| 国产素人在线观看| 色域天天综合网| 激情五月综合| 91黄在线观看| 亚洲iv一区二区三区| 6080yy午夜一二三区久久| 黄色片在线免费观看| 激情五月播播久久久精品| 色99中文字幕| 亚洲国产va精品久久久不卡综合| 高清毛片在线观看| 91亚洲精品久久久久久久久久久久| 97久久人人超碰| 黄色大片在线播放| 国产精品久在线观看| 成人免费观看视频| 黄色精品免费看| 91嫩草在线| 亚洲精品国产一区二区精华液| 国产成人精品一区二区三区免费| 亚洲精品欧美极品| 亚洲成年网站在线观看| 91精品欧美一区二区三区综合在| 香蕉久久夜色精品| 很污的网站在线观看| 91色porny在线视频| 日本在线看片免费人成视1000| 亚洲桃色在线一区| 国产精品第一国产精品| 91在线porny国产在线看| 国产偷自视频区视频一区二区| 婷婷久久免费视频| 国产三级视频在线| 8050国产精品久久久久久| 91麻豆免费看| 久久亚洲国产精品尤物| mm131午夜| 亚洲乱码一区av黑人高潮| 久久99精品久久久| 日韩免费观看av| 久久久久久99久久久精品网站| 国外成人福利视频| 男人天堂手机在线视频| 亚洲毛片在线免费观看| 国产一区二区三区四区在线观看| 国产原创视频在线观看| 欧美久久在线| 日韩精选视频| 午夜激情影院| 久草在线在线视频| 亚洲a在线观看| 国产一区二区三区在线播放免费观看| 岛国一区二区三区| 欧美一二区在线观看| 波多野结衣久久精品| 香蕉国产在线| 国产色视频一区| 一区二区高清| 羞羞的视频在线观看| 日韩精品久久一区二区三区| 亚洲国产高清自拍| 国产成人免费视频网站高清观看视频 | 免费成人直播| 欧美性受xxxx黑人猛交88| 在线视频日韩精品| 久久精品人人爽人人爽| 欧美色网址大全| 黄色在线免费网站| 国产片侵犯亲女视频播放| 久久久久久久久国产| 懂色av影视一区二区三区| 日韩精彩视频在线观看| 国产精品美女久久久久人| 永久www成人看片| 鲁片一区二区三区| 久久激情五月激情| 国产精品色一区二区三区| 精品国产91久久久久久| 国产成人av在线影院| 日韩av超清在线观看| 色国产在线视频| 97超碰最新| 日韩精品中文字幕在线播放| 国产欧美日韩不卡免费| 欧美日韩一区自拍| 韩国精品视频在线观看| 欧美性孕妇孕交| 国产96在线 | 亚洲| 国产伦精品免费视频| 日韩成人在线播放| 亚洲桃色在线一区| 麻豆一区二区三| 欧美自拍偷拍| 外国成人直播| 精品资源在线看| 男女无套免费视频网站动漫| 国语精品中文字幕| 欧美激情三级免费| 日韩精品在线网站| 亚洲综合偷拍欧美一区色| 国产精品 日产精品 欧美精品| 日韩精品2区| 3d动漫一区二区三区在线观看|