今日代碼 PK | 處理 Spring 事務和鎖沖突
在我們日常的開發(fā)中,經常會接觸到事務和鎖,
當同時用到這二者的時候,你知道里面的坑嗎?
比如,某個service里的下面這段偽代碼有問題嗎?
示例代碼:
@Transactional(rollbackFor = Exception.class)
public Boolean test() {
String lock = "id";
synchronized (lock.intern()) {
// 業(yè)務代碼
}
// 剩余邏輯
return true;
}
很顯然是有問題,因為MySQL的默認隔離級別是可重復讀,
因此在該事務提交前其他事務并不能獲取到該事務對數(shù)據(jù)操作后的結果,
那么在第一個事務的synchronized塊執(zhí)行完之后且事務提交之前,
其他事務在執(zhí)行synchronized塊中的代碼時使用的仍然是老數(shù)據(jù),
從這方面來說其實就相當于沒有鎖住,也就是鎖失效。
那么怎么改呢?示例代碼如下:
public Boolean test() {
String lock = "id";
PostService postService = (PostService) AopContext.currentProxy();
synchronized (lock.intern()) {
return postService.innerTest();
}
return true;
}
@Transactional(rollbackFor = Exception.class)
public Boolean innerTest() {
// 業(yè)務邏輯
return true;
}
上面的代碼中我們沒有直接調用innerTest方法而是通過AopContext獲取的對象調用,
你知道為什么嗎?歡迎投票并在評論區(qū)討論。
完整代碼片段來源于代碼小抄,歡迎點擊進入小程序閱讀!
在線訪問:https://www.codecopy.cn/post/gzshnr
更多優(yōu)質代碼歡迎進入小程序查看!
往期推薦
評論
圖片
表情
