中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring注解和同步鎖不能同步怎么辦

發布時間:2021-07-16 10:30:37 來源:億速云 閱讀:233 作者:小新 欄目:編程語言

這篇文章主要介紹Spring注解和同步鎖不能同步怎么辦,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

結論:如果在service層的方法上同時使用事務和同步鎖無法保證數據同步。

@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();
    }
  }
}

上面這個例子無法保證數據的一致性,synchronized 同理。

原因:

  根據spring的AOP的特性,會在update方法之前開啟事務,之后再加鎖,當鎖住的代碼執行完成后,再提交事務。

  由于lock代碼塊執行是在事務之內執行的,在代碼塊執行完時,事務還未提交,因此其它線程進入synchronized代碼塊后,讀取的數據庫數據不是最新的(臟讀)。

解決方案:

  1.在還沒有開啟事務之前就加同步鎖,用加鎖的方法調用加事務的方法

@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() {
    ... ...
  }
}

以上是“Spring注解和同步鎖不能同步怎么辦”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上蔡县| 襄樊市| 甘泉县| 惠州市| 石家庄市| 白河县| 安泽县| 绍兴市| 曲松县| 山丹县| 遵化市| 都江堰市| 海口市| 祁门县| 鹿泉市| 会同县| 桐乡市| 乃东县| 辽阳县| 临夏县| 长泰县| 潞西市| 麦盖提县| 乌鲁木齐市| 辉南县| 伊金霍洛旗| 霍山县| 达拉特旗| 平遥县| 乐山市| 安陆市| 义马市| 关岭| 茂名市| 壶关县| 淳安县| 区。| 定安县| 文登市| 双柏县| 永吉县|