Spring注解和同步鎖不能同步問題解決
這篇文章主要介紹了Spring注解和同步鎖不能同步問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
結(jié)論:如果在service層的方法上同時(shí)使用事務(wù)和同步鎖無(wú)法保證數(shù)據(jù)同步。
@Service
public class ServiceImpl{
private static Lock lock = new ReentrantLock(false);
@Transactional(rollbackFor = Exception.class)
public void update() {
try {
lock.lock();
... ...
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
上面這個(gè)例子無(wú)法保證數(shù)據(jù)的一致性,synchronized 同理。
原因:
根據(jù)spring的AOP的特性,會(huì)在update方法之前開啟事務(wù),之后再加鎖,當(dāng)鎖住的代碼執(zhí)行完成后,再提交事務(wù)。
由于lock代碼塊執(zhí)行是在事務(wù)之內(nèi)執(zhí)行的,在代碼塊執(zhí)行完時(shí),事務(wù)還未提交,因此其它線程進(jìn)入synchronized代碼塊后,讀取的數(shù)據(jù)庫(kù)數(shù)據(jù)不是最新的(臟讀)。
解決方案:
1.在還沒有開啟事務(wù)之前就加同步鎖,用加鎖的方法調(diào)用加事務(wù)的方法
@Service
public class ServiceImpl{
private static Lock lock = new ReentrantLock(false);
public void update1() {
try {
lock.lock();
update2();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
@Transactional(rollbackFor = Exception.class)
public void uodate2() {
... ...
}
}
2.把鎖放到上一層
@Controller
public class TestController{
@Autowired
private IServiceImpl serviceImpl;
private static Lock lock = new ReentrantLock(false);
public String test() {
try {
lock.lock();
serviceImpl.update();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
@Service
public class ServiceImpl{
@Transactional(rollbackFor = Exception.class)
public void update() {
... ...
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- spring-boot @Component和@Bean的區(qū)別詳解
- Spring @Configuration和@Component的區(qū)別
- spring @component的作用詳細(xì)介紹
- Spring 報(bào)錯(cuò):元素 "context:component-scan" 的前綴 "context" 未綁定的問題解決
- Spring實(shí)戰(zhàn)之@Autowire注解用法詳解
- Spring @Transactional注解失效解決方案
- springmvc的@Validated注解使用
- Spring boot注解@Async線程池實(shí)例詳解
- spring @Component注解原理解析
相關(guān)文章
Java實(shí)現(xiàn)簡(jiǎn)易版聯(lián)網(wǎng)坦克對(duì)戰(zhàn)小游戲(附源碼)
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)簡(jiǎn)易版聯(lián)網(wǎng)坦克對(duì)戰(zhàn)小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
druid ParserException類錯(cuò)誤問題及解決
這篇文章主要介紹了druid ParserException類錯(cuò)誤問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
關(guān)于IDEA無(wú)法預(yù)覽Markdown文件的解決思路
在IntelliJ IDEA中,有時(shí)Markdown文件無(wú)法預(yù)覽可能是因?yàn)槲募P(guān)聯(lián)設(shè)置不正確或配置信息錯(cuò)誤,首先,檢查IDE的File Types設(shè)置,確保.md和.markdown后綴已正確注冊(cè),其次,對(duì)照官方配置信息,調(diào)整Markdown設(shè)置2024-09-09
Java實(shí)現(xiàn)簡(jiǎn)單臺(tái)球游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單臺(tái)球游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Java Web實(shí)現(xiàn)添加定時(shí)任務(wù)的方法示例
這篇文章主要介紹了Java Web實(shí)現(xiàn)添加定時(shí)任務(wù)的方法,涉及java web定時(shí)任務(wù)控制類定義、調(diào)用及監(jiān)聽器定義、添加等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
SpringBoot框架實(shí)現(xiàn)支付和轉(zhuǎn)賬功能
在 Spring Boot 框架中實(shí)現(xiàn)支付和轉(zhuǎn)賬功能時(shí),涉及到多個(gè)細(xì)節(jié)和注意點(diǎn),這些功能通常需要高度的安全性、穩(wěn)定性和可擴(kuò)展性,本文介紹了實(shí)現(xiàn)支付和轉(zhuǎn)賬功能的一些關(guān)鍵點(diǎn),需要的朋友可以參考下2024-08-08
Java連接Sql數(shù)據(jù)庫(kù)經(jīng)常用到的操作
這篇文章主要介紹了Java連接Sql數(shù)據(jù)庫(kù)經(jīng)常用到的操作的相關(guān)資料,需要的朋友可以參考下2016-02-02
Spring Security6 最新版配置及實(shí)現(xiàn)動(dòng)態(tài)權(quán)限管理
Spring Security 在最近幾個(gè)版本中配置的寫法都有一些變化,很多常見的方法都廢棄了,并且將在未來的 Spring Security7 中移除,因此又補(bǔ)充了一些新的內(nèi)容,重新發(fā)一下,供各位使用 Spring Security 的小伙伴們參考,需要的朋友可以參考下2024-03-03

