刷到一個說法,建議不要使用@transaction注解。這個說法不太準確,注解可以用,但標注的事務粒度不能太大,這樣可能會引起數據庫阻塞問題。以下介紹注解事務和編程式事務的兩種用法。
關鍵字:聲明式事務,編程式事務,顯式事務
文章目錄
- 1.反例演示
- 2.事務粒度過大-負面影響
- 3.建議
- (1)編程式事務代碼模板
1.反例演示
案例中5,6才是一個原子操作,但是注解標注得太大了,執行外部調用時卡住了,導致事務阻塞會拖垮數據庫。
2.事務粒度過大-負面影響
事務粒度過大可能會阻塞數據庫并導致性能問題,具體影響如下:
阻塞數據庫的主要表現
鎖競爭加劇:
大事務持有鎖的時間更長
更多數據行/表被鎖定
其他事務需要等待這些鎖釋放
資源占用:
長時間占用數據庫連接
未提交事務會占用UNDO日志空間
內存中維護的事務狀態數據增多
具體影響
并發性能下降:
其他會話可能被阻塞等待鎖釋放
系統吞吐量降低
系統資源壓力:
內存消耗增加
可能填滿數據庫的臨時表空間或日志空間
風險增加:
死鎖概率提高
事務失敗時回滾代價高
可能導致連接池耗盡
3.建議
建議把事務粒度控制得更小一些再使用@Transactional注解。或者使用編程式事務,準確處理需要搞成事務的步驟。
(1)編程式事務代碼模板
以下是編程式事務代碼模板參考:
@Autowiredprivate TransactionTemplate transactionTemplate;transactionTemplate.execute((transactionStatus)->{try {System.out.println("業務邏輯");} catch (Exception e) {transactionStatus.setRollbackOnly();// 標記為回滾log.error("服務異常");}return transactionStatus;});