【實戰場景】@Transactional中使用for update的注意點

【實戰場景】@Transactional中使用for update的注意點

  • 開篇詞:
  • 干貨篇:
      • 知識回顧
      • 注意點
        • 1.鎖的范圍和粒度:
        • 2.事務的隔離級別:
        • 3.死鎖:
        • 4.性能影響:
        • 5.事務的邊界:
        • 6.異常處理:
        • 7. 數據庫和存儲引擎的支持:
        • 8. 測試和驗證:
  • 總結篇:
  • 我是杰叔叔,一名滬漂的碼農,下期再會!

開篇詞:

這次接到一個任務要去實現點贊和取消點贊的功能,看似簡單的一個需求,里面要考慮的點還是不少,本次采用的方案是spring的@transactional配合mysql的悲觀鎖for update去實現

(PS:當然可以去用redis去做,但得考慮后續的數據雙向同步問題和頂著快速上線的壓力還是選擇了悲觀鎖方案,改動小呀 @_@)

干貨篇:

知識回顧

  • @Transactional 是 Spring 框架中的一個非常重要的注解,它用于聲明一個方法或類需要被事務管理。當你使用 @Transactional 注解時,Spring 容器會為這個方法或類創建一個代理(proxy),并在調用時應用相應的事務管理邏輯。這意呀著,你可以通過簡單的注解來管理事務的邊界,包括事務的開始、提交或回滾等,而無需手動編寫大量的代碼來控制事務。
  • 在MySQL中,FOR UPDATE是一個在SELECT語句中使用的選項,它主要用于在事務處理(Transaction Processing)環境中鎖定選中的行,以便進行后續的更新操作。當你在一個事務中執行一個帶有FOR UPDATE的SELECT語句時,MySQL會鎖定這些行,直到當前事務結束(通過COMMIT或ROLLBACK語句)。這樣做的目的是為了防止其他事務修改這些行,從而保持數據的一致性和完整性。

注意點

在Spring框架中使用@Transactional注解時,結合SQL查詢中的FOR UPDATE子句,需要注意以下幾個方面以確保事務的正確性和性能:

1.鎖的范圍和粒度:
  • FOR UPDATE會鎖定查詢到的行,直到當前事務結束。因此,要仔細考慮查詢的范圍,避免不必要地鎖定大量行,這可能會影響到并發性能。
  • 確保你的查詢是精確的,只鎖定需要修改的行。
2.事務的隔離級別:
  • 不同的隔離級別會影響鎖的行為和可見性。例如,在READ COMMITTED隔離級別下,鎖通常只在需要時持有,而在SERIALIZABLE隔離級別下,可能會鎖定更多的數據以防止幻讀。
  • 檢查并設置適合你的業務場景的事務隔離級別。
3.死鎖:
  • 當多個事務相互等待對方釋放鎖定的資源時,可能會發生死鎖。在使用FOR UPDATE時,尤其要注意避免死鎖的發生。
  • 設計事務時,盡量保持事務簡短,避免在事務中執行復雜的邏輯或等待用戶輸入。
  • 如果檢測到死鎖,MySQL會自動檢測并中斷其中一個事務以解鎖。但是,你應該準備好處理事務回滾的情況,并確保應用能夠正確地從失敗中恢復。
4.性能影響:
  • 鎖定行會增加數據庫操作的開銷,包括鎖的獲取、保持和釋放。
  • 監控數據庫的性能指標,如鎖等待時間、鎖沖突等,以確保事務處理不會成為性能瓶頸。
5.事務的邊界:
  • 確保@Transactional注解正確應用在你的服務層方法上,并且這些方法包含了需要事務支持的數據庫操作。
  • 注意不要在同一個事務中調用其他服務層的方法,除非這些方法也標記為@Transactional(這可能會導致不必要的嵌套事務或事務傳播問題)。
6.異常處理:
  • 在事務方法中正確處理異常,確保在發生錯誤時能夠回滾事務。
  • 使用Spring的@Transactional注解時,默認情況下,運行時異常和錯誤會觸發事務回滾,而檢查型異常則不會。你可以通過rollbackFor和noRollbackFor屬性來自定義回滾行為。
7. 數據庫和存儲引擎的支持:
  • 確保你的數據庫和存儲引擎支持行級鎖(如InnoDB)。
  • 不同的存儲引擎在鎖的實現和性能上可能會有所不同。
8. 測試和驗證:
  • 在開發過程中,對使用@Transactional和FOR UPDATE的代碼進行充分的測試,以確保它們按預期工作。
  • 使用壓力測試和并發測試來驗證事務的性能和穩定性。

總結篇:

通過注意這些方面,你可以更有效地在Spring應用中使用@Transactional和SQL查詢中的FOR UPDATE子句,從而確保數據的一致性和應用的性能。

在這里插入圖片描述

我是杰叔叔,一名滬漂的碼農,下期再會!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43593.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【漏洞復現】網神 SecGate 3600 防火墻 sys_export_conf_local_save 任意文件讀取

免責聲明: 本文內容旨在提供有關特定漏洞或安全漏洞的信息,以幫助用戶更好地了解可能存在的風險。公布此類信息的目的在于促進網絡安全意識和技術進步,并非出于任何惡意目的。閱讀者應該明白,在利用本文提到的漏洞信息或進行相關測…

javaweb學習day5--《HTML篇》Springboot的模塊創建、HTML的相關知識點詳解

一、前言 從今天開始,就要啟動后端的學習了,Springboot會貫穿到底,一定要跟著小編嚴謹的去搭建Springboot環境,依賴添加的過程可能需要2分鐘左右,讀者們要耐心等待一下,搭建好Springboot之后才算正式的開始…

算力革命:彈性租賃,解鎖無限可能

華為創始人任正非曾在一場程序設計競賽中說道,我們即將進入第四次工業革命,基礎就是大算力。事實上,隨著5G、人工智能等信息技術的迅猛發展,算力需求持續增長,但高昂的成本和快速的技術迭代讓許多中小企業和個人開發者…

Covalent Network(CXT)通過社區投票將代幣遷移并更名為 CXT,以推動人工智能更深層次的創新

專注于人工智能和 Web3 的模塊化數據基礎設施 Covalent Network(CXT)宣布,其治理提案已通過社區投票并順利實施,即將原生代幣 CQT 遷移為新的 CXT 代幣,并部署至新的合約。這一關鍵性轉變標志著 Covalent Network&…

git刪除提交記錄,并使用idea將代碼重新提交到gitee倉庫

git 新建分支將之前的記錄刪除重新提交 轉載鏈接 https://blog.csdn.net/qq_37142541/article/details/139860956

03-NoSQL之Redis配置與優化

一、redis與memcache總體對比 1.性能 Redis:只使用單核,平均每一個核上Redis在存儲小數據時比Memcached性能更高。 Memcached:可以使用多核,而在100k以上的數據中,Memcached性能要高于Redis。 2.內存使用效率 MemC…

springboot文達辦公物資管理系統-計算機畢業設計源碼51191

摘要 本文介紹了一種名為"文達辦公物資管理系統"的基于JAVA語言、基于Springboot框架和MYSQL數據庫開發的管理系統。該系統主要分為管理員和員工用戶兩個角色,以滿足不同用戶的需求。 對于管理員用戶,系統提供了儀器設備管理、設備借用管理、設…

【大數據技術】換新電腦了,如何快速遷移MySQL到新電腦上(含程序+數據),這樣既快速又高效,省去了“各種安裝+各種配置+各種遷移數據”帶來的麻煩和時間

【大數據技術】換新電腦了,如何快速遷移MySQL到新電腦上(含程序數據 背景步驟總結 背景 很久沒有寫博文了哦,最近我換了新的筆記本,于是需要在新筆記本電腦上搭建MySQL環境,因為我原電腦上是安裝的MySQL解壓版,故我想偷偷懶&…

可理解性評估:使用Google Gemini優化語音識別的意義保留

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

nftables(5)表達式(3)PAYLOAD EXPRESSIONS

PAYLOAD EXPRESSIONS Payload expressions在nftables中扮演著重要的角色,因為它們允許用戶定義復雜的規則,這些規則可以基于數據包的內容(即有效載荷)來過濾、修改或允許數據包通過。這些表達式可以執行諸如數據拷貝、比較、位操…

實驗1 —— 安全策略的練習

實驗拓撲圖 實驗要求 1.DMZ區內的服務器,辦公區僅能在辦公時間內(9:00-18:00)可以訪問,生產區的設備全天可以訪問; 2.生產區不允許訪問互聯網,辦公區和游客區允許訪問互聯網 3.辦公區…

RabbitMQ保證消息被成功發送和消費

一 : 在使用 RabbitMQ 作為消息隊列時,保證消息被成功發送和消費是一個非常重要的問題。以下是一些關鍵點和最佳實踐,以確保消息的可靠傳輸和處理。* 配置方式: 保證消息被成功發送 確認模式(Confirm Mode):生產者可以…

在SpringBoot使用AOP防止接口重復提交

前言 防止接口重復提交有跟多種方法,可以在前端做處理。同樣在后端也能處理,而且后端的處理也有很多中方法。最先能想到的就是加鎖,也可以直接在該接口的實現過程中進行處理(可以參考防止數據重復提交的6種方法(超簡單)&#xff…

動手學Avalonia:基于硅基流動構建一個文生圖應用(一)

文生圖 文生圖,全稱“文字生成圖像”(Text-to-Image),是一種AI技術,能夠根據給定的文本描述生成相應的圖像。這種技術利用深度學習模型,如生成對抗網絡(GANs)或變換器(T…

【Mac】Charles for Mac(HTTP協議抓包工具)及同類型軟件介紹

軟件介紹 Charles for Mac 是一款功能強大的網絡調試工具,主要用于HTTP代理/HTTP監視器。以下是它的一些主要特點和功能: 1.HTTP代理:Charles 可以作為HTTP代理服務器,允許你查看客戶端和服務器之間的所有HTTP和SSL/TLS通信。 …

金航標kinghelm宋仕強在介紹自己公司時說

金航標kinghelm宋仕強在介紹自己公司時說,金航標成立于2007年,成立地點在華強北雷圳大廈803室,后搬到華強北廣業大廈24樓CD室,后搬遷到龍華展滔科技大廈C座C809和C817室,現在的辦公地址為龍崗區坂田街道百瑞達大廈&…

WSL安裝USB驅動

wsl用不了USB盤,需要安裝驅動 1、安裝windows驅動 https://github.com/dorssel/usbipd-win/releases 下載msi,并且安裝 2、linux里面安裝 sudo apt install linux-tools-5.4.0-77-generic hwdata sudo update-alternatives --install /usr/local/bin/usb…

PageDTO<T>,PageQuery,BeanUtils,CollUtils的封裝

一、PageDTO<T> import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.annotation.JsonIgnore; import com.tianji.common.utils.BeanUtils; import com.tianji.common.utils.CollUtils; import com.tianji.common.utils.…

C#中的MD5摘要算法與哈希算法

文章目錄 一、哈希算法基礎二、MD5 算法原理三、MD5摘要算法四、哈希算法五、C#實現示例MD5算法示例哈希算法示例字符串MD5值對比 六、總結 一、哈希算法基礎 哈希算法是一種單向密碼體制&#xff0c;它將任意長度的數據轉換成固定長度的字符串。這種轉換是不可逆的&#xff0…

IDEA中配置代理,解決Codearts Snap登陸不了的問題

問題描述&#xff1a;在mac電腦中的idea中安裝了華為的codearts snap插件&#xff0c;一直登錄不了&#xff0c;賬號是沒問題的&#xff0c;后來我懷疑是我的代理有問題&#xff0c;找到IDEA中的代理設置先是有這個問題“You have JVM property "https.proxyHost" se…