91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

炉霍县| 武川县| 札达县| 东海县| 彩票| 棋牌| 电白县| 镇巴县| 太康县| 石城县| 肃北| 石棉县| 河池市| 建昌县| 文山县| 福安市| 玉溪市| 崇礼县| 枣庄市| 城口县| 宽甸| 平泉县| 枞阳县| 云安县| 丁青县| 姚安县| 阜康市| 高雄县| 中西区| 新源县| 随州市| 长沙市| 宁城县| 镇巴县| 西峡县| 凌源市| 罗江县| 扎赉特旗| 苗栗县| 晋江市| 隆德县|