SSM項目中樂觀鎖機制

樂觀鎖

樂觀鎖,大多是基於數據版本( Version )記錄機制實現。在基於數據庫表的版本解決方案中,一般是通過爲數據庫表增加一個 “version” 字段來實現。讀取出數據時,將此版本號一同讀出,之後更新時, 對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號等於數據庫表當前版本號,則予以更新,否則認爲是過期數據。

優點

樂觀鎖機制避免了長事務中的數據庫加鎖開銷(操作員 A和操作員 B 操作過程中,都沒有對數據庫數據加鎖),大大提升了大併發量下的系統整體性能表現。

缺點

容易造成髒讀現象

實例

用預約訂單這個例子,當同時有100個人同時定一個訂單但是訂單隻有50份就會出現超賣現象
我們使用樂觀鎖來處理這個問題
1.給t_ordersetting表添加version字段

alter table t_ordersetting add version1 int(11) default '0';

2.OrderSetting pojo添加version字段

private Integer version;
public Integer getVersion() {
    return version;
}

public void setVersion(Integer version) {
    this.version = version;
}

3修改預約方法

首先通過查詢此訂單

//根據條件查詢出此訂單
 OrderSetting orderSetting = orderSettingMapper.findByOrderDate(date);
//可以預約,設置預約人數加一
orderSetting.setReservations(orderSetting.getReservations()+1);
int i = orderSettingDao.editReservationsByOrderDate(orderSetting);
// 如果更新失敗那麼拋出異常(由於有事務所以整個方法回滾)
if(i == 0){
    throw new RuntimeException("更新失敗");
}

4.Mapper接口

 //更新已預約人數(此處添加返回值,返回值是更新的行數)
 public int editReservationsByOrderDate(OrderSetting orderSetting);

5.mapper.xml

<!--更新已預約人數-->
<update id="editReservationsByOrderDate" parameterType="com.itheima.pojo.OrderSetting">
  update t_ordersetting set reservations = #{reservations},
  version = version + 1 where orderDate = #{orderDate} and version = #{version}
</update>

解釋

當兩個用戶同時進行訂單預定,第一個用戶在預定時查出版本號,在更新時匹配版本號後 版本號+1,完成預定,在與此同時,另一個用戶也在訪問,這個用戶版本號爲與數據庫內的不一致就更新失敗,拋出異常事務回滾。

發佈了13 篇原創文章 · 獲贊 7 · 訪問量 788
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章