java中事務中遇到鎖會造成什么問題,以及該如何解決?

在spring中實現事務有多種方式,主要是兩種:一種是聲明式事務,一種是編程式事務,今天我們就講聲明式事務中的一種,使用注解@Transactional,這個注解的作用就是幫助我們在代碼執行完畢之后自動提交事務,在發生異常時進行回滾。

比如以下這段代碼:

@Transactional
public void updateDBInfo(List<Entity> entityList){//待更新的數據entityList.stream().foreach((arg) -> {arg.setModifier("xxx");arg.setModifierTime("xxxx-xx-xx hh:mm:ss");});this.updateBatchById(entityList);
}

?這是一段非常簡單的代碼段。假如我們就是需要加進行更新,但是如果這段代碼需要涉及到鎖的話,如果架構是分布式,也就是部署了多臺service Application服務器,然后進行負債均衡,那么此時如果有多個用戶同時操作的話,每個用戶的請求會由于負債均衡可能到達不同的service Application服務器應用。所以這時候我們的鎖用線程級別的鎖是不行的,只能用進程級別的鎖,也就是分布式鎖。分布式鎖的話可以用redis的那個命令叫setNx,這里我就不過多贅述了。主要講在事務里面有鎖會造成什么問題,以及如何解決該問題。

如果我們還是使用這個注解@Transactional,這個注解我們剛剛也說了。這個注解的作用就是幫助我們在代碼執行完畢之后自動提交事務,在發生異常時進行回滾。

首先改造代碼進行加鎖:

@Transactional
public void updateDBInfo(List<Entity> entityList){
RLock lock = null;
try {lock = redissonTool.tryLock(RedisKeyConstants.REDIS_KEY_PURCHASE_ORDER_EXTEND, Codes.KEY_ERROR);//待更新的數據entityList.stream().foreach((arg) -> {arg.setModifier("xxx");arg.setModifierTime("xxxx-xx-xx hh:mm:ss");});this.updateBatchById(entityList);
} finally {redissonTool.unLock(lock);
}
}

?如果我們是這樣寫的話,那么會有什么問題呢?

當代碼執行完畢,也就是finally里面的鎖都釋放了,去提交事務,但是提交事務也是需要時間的,有可能還沒提交事務完,由于鎖釋放了,其他客戶端就會拿到鎖了,但是此時該用戶感知不到此時DB數據庫中的數據是最新的,也就是所謂的可見性,什么是可見性?

可見性:顧名思義就是一個線程的操作結果對其他所有線程都是可見的,因為每一個線程都共享同一個共享主內存。

那么這時候另一個用戶在客戶端就不知道這個DB的數據 是更改的,又會去更改,然后提交事務,這時候剛剛那個客戶端的用戶也提交事務成功了,那么就會造成臟數據了,數據不一致。

我給大家畫個圖展示:

但是由于我剛剛說的這種,A還沒提交更新事務之后,鎖釋放,B拿到,B更新完,提交更新事務,成功改為2,A的提交更新事務完成。此時就還是1.就是臟數據了。

所以有什么辦法解決呢?

那我們把自動事務注解@Transactional改成手動事務。讓事務提交成功之后再去釋放鎖,而不是在鎖釋放之后再提交事務。

手動事務我用的是transactionTemplate.execute(TransactionCallback callback);然后用的是TransactionCallback接口的抽象實現類,用匿名內部類。

TransactionCallbackWithoutResult的抽象方法:doInTransactionWithoutResult

也就是:

transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {//業務更新邏輯}});

總結:

? ? ? ? 在事務中碰到鎖,必須使用手動事務,讓事務提交成功之后,再去釋放鎖。而非釋放鎖之后再提交事務。也就是不能使用@Transactional注解的自動提交事務。

一般模板:

RLock rLock = null;
try{rLock = ?redissonTool.tryLock("REDIS_LOCK_NAME");
}catch(){transactionTemplate.execute(new TransactionCallbackWithoutResult(){protected void doInTransctionWithoutResult(){//業務更新邏輯;}})
}finally{rlock.unlock();
}

?最后:

? ? ? ? 如果大家覺得這篇文章對你們有所幫助的話,麻煩點個免費的贊贊,謝謝,也祝各位碼農在未來的IT道路上越走越遠。

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

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

相關文章

淘寶評論數據爬取全攻略

一、淘寶評論數據爬取的背景與意義 隨著互聯網的快速發展&#xff0c;電子商務平臺如淘寶、京東等在我國市場占有率逐年上升。消費者在購買商品時&#xff0c;除了關注商品的價格、質量等因素外&#xff0c;還會參考其他消費者的評價和評論。淘寶評論數據爬取是指通過技術手段…

C# NX二次開發-設置背景顏色

使用UF函數能直接設置UG背景顏色: 1.設置背景顏色選項為純色: 2.編寫更新背景顏色代碼: var nxColor NXColor.Factory._Get(186);var rgb nxColor.GetRgb();double[] arr [rgb.R, rgb.G, rgb.B];theUf.Disp.SetColor(UFConstants.UF_DISP_BACKGROUND_COLOR, UFConstants.UF…

oracle刪除表空間和用戶命令

創建表空間和用戶可參考 ORACLE創建表空間,用戶,修改密碼,分配權限,以及導入導出_oracle表空間的密碼-CSDN博客 1.刪除表空間 --刪除空的表空間&#xff0c;但是不包含物理文件 drop tablespace tablespace_name; --刪除非空表空間&#xff0c;但是不包含物理文件 drop tabl…

化妝品FDA認證需要注意哪方面

化妝品FDA認證概述 化妝品FDA認證是指化妝品產品通過美國食品藥品監督管理局&#xff08;FDA&#xff09;的審核和認證&#xff0c;證明其符合相關法規和標準&#xff0c;具備在美國市場合法銷售的條件。這一認證過程不僅涉及產品的成分合規性&#xff0c;還包括產品的標簽、安…

C#字符串格式化之$語法

引言 字符串是編程中使用較廣的一種數據&#xff0c;它由數字、字母、下劃線等組成。在使用過程中會對字符串進行格式化。在C#語言中&#xff0c;.NET 6及以上使用字符串插值&#xff08;$""語法&#xff09;對字符串格式化。 $語法 .NET 6 及以上提供的一種新的語…

Facebook海外企業廣告賬戶是什么?有什么優勢?

隨著全球化的迅速發展&#xff0c;越來越多國內企業開始將目光轉向海外市場&#xff0c;尋求更為廣闊的商機與更高的發展空間。而在這個全球化的時代&#xff0c;Facebook作為全球最大的社交媒體平臺之一&#xff0c;自然成為了眾多企業進軍海外市場的首選平臺之一。那么如果想…

flask輕松入門,概念講解

Hello World Flask 是輕量級web框架&#xff0c;僅保留了核心功能&#xff1a; 請求響應處理模板渲染URL路由 文章目錄 Hello Worldflask命令模式python命令模式兩種模式對比修改入口文件配置flask命令修改python命令修改 修改端口和地址flask命令修改python命令修改 修改 URL …

java——順序表

前言&#xff1a;順序表是線性表的一種&#xff0c;它是較于數組更加靈活的一種儲存方式。線性表通常是邏輯上是連續的一條直線&#xff0c;但在物理上不是連續的。java中已經實現好了一個順序表&#xff0c;搭配泛型可以支持各種類型的使用&#xff0c;下面就來介紹該如何使用…

以太網:ARP和信息處理狀態機+代碼實現

ARP過程只需要一次發送和一次接受就可以完成了&#xff1b; 在實際實現協議棧的時候我個人認為要以主動ARP開始&#xff1b; 主動ARP&#xff1a;發送一次ARP請求&#xff0c;接受一個ARP報文&#xff1b; 使用這種方式的原因是上位機可能不知道你的IP地址&#xff08;當然如…

Mysql疑難報錯排查 - Field ‘XXX‘ doesn‘t have a default value

項目場景&#xff1a; 數據庫環境 &#xff1a;mysql8; 工程使用&#xff1a;MyBatisPlus 表情況&#xff1a; 問題描述 某一個插入語句使用了 MyBatisPlus 的 save 方法&#xff0c;因為end_time1 end_time2都并沒有值&#xff0c;所以在MyBatisPlus默認情況下&#xff0c;…

如何使自己寫的代碼易讀易懂?

〓● 如果代碼可讀性不佳、不容易理解&#xff0c;可能造成如下問題&#xff1a; 〓? 其他工程師浪費時間解讀它&#xff1b; 〓? 誤解導致引入缺陷&#xff1b; 〓? 其他工程師修改時破壞代碼。 〓● 提高代碼可讀性&#xff0c;有時候可能使其變得更為冗長、占用更多的…

【Python】深入認識Python數據類型和變量

???? 文章目錄 1. 引言數據類型的重要性Python中的數據類型概述 2. 數字類型整型&#xff08;int&#xff09;浮點型&#xff08;float&#xff09;復數&#xff08;complex&#xff09; 3. 字符串類型字符串的定義與使用字符串操作方法 4. 布爾類型布爾值和布爾運算 5. 列…

docker網絡詳解

1. 網絡模式 1.1 網絡結構 當安裝Docker以后&#xff0c;會自動創建三個網絡。可以使用docker network ls命令列出這些網絡。 $ docker network ls NETWORK ID NAME DRIVER SCOPE 440aefe8afa3 bridge bridge local aa8d6325580f host host …

02JAVA字符串和集合

1.字符串 1.String 介紹: String在java.lang包下,使用不需要導包,String代表字符串,帶""字符串都是String類的對象 字符串的特點: 字符串不可變,他們的值在創建后不能被改變 字符串效果相當于(char[]),底層原理是字節數組(byte[]) String構造方法: String 變量名 ne…

chat-glm4,qwen1.5性能對比

modelMMLUC-EvalGSM8KHumanEvalglm-4-9b74.777.184.070.1qwen1.5-7b6174.162.536.0qwen1.5-14b67.678.770.137.8 數據來源是以下兩個圖。可以看到GLM4非常優秀&#xff0c;qwen應該也快要開源自己的新模型了&#xff0c;希望國內的大模型團隊能夠繼續堅持&#xff0c;持續努力&…

AI框架之Spring AI與Spring Cloud Alibaba AI使用講解

文章目錄 1 AI框架1.1 Spring AI 簡介1.2 Spring AI 使用1.2.1 pom.xml1.2.2 可實現的功能 1.3 Spring Cloud Alibaba AI1.4 Spring Cloud Alibaba AI 實踐操作1.4.1 pom.xml1.4.2 配置文件1.4.3 對接文本模型1.4.4 文生圖模型1.4.5 語音合成模型 1 AI框架 1.1 Spring AI 簡介…

NSSCTF-Web題目5

目錄 [SWPUCTF 2021 新生賽]error 1、題目 2、知識點 3、思路 [LitCTF 2023]作業管理系統 1、題目 2、知識點 3、思路 [HUBUCTF 2022 新生賽]checkin 1、題目 2、知識點 3、思路 [SWPUCTF 2021 新生賽]error 1、題目 2、知識點 數據庫注入、報錯注入 3、思路 首先…

淺談InoDB中的行級鎖

行級鎖的類型&#xff1a; Record Lock&#xff0c;記錄鎖&#xff0c;僅僅把?條記錄鎖上&#xff0c;記錄鎖分為排他鎖和共享鎖。Gap Lock&#xff0c;間隙鎖&#xff0c;鎖定?個范圍&#xff0c;但是不包含記錄本身&#xff0c;只存在于可重復讀隔離級別&#xff0c;?的是…

Oracle 重置system用戶的密碼

荊軻刺秦王 如果您忘記了Oracle數據庫的密碼&#xff0c;可以通過以下步驟來重置密碼&#xff1a; Oracle 版本&#xff1a;linux 11g Release 11.2.0.4.0-64bit Froduction 1. 以SYSDBA權限登錄到數據庫。 conn / as sysdba 2. 停止數據庫實例。 shutdown immediate; 3…

vue 文件預覽mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml

vue 文件預覽 圖片、mp4、txt、pptx、xls、xlsx、docx、pdf、html、xml 最近公司要做一個類似電腦文件夾的功能&#xff0c;支持文件夾操作&#xff0c;文件操作,這里就不說文件夾操作了&#xff0c;說說文件預覽操作&#xff0c;本人是后端java開發&#xff0c;前端vue&#…