mysql-鎖問題

悲觀鎖

A:執行流程

  1. 在任意記錄修改時,先給此記錄加入排他鎖
  2. 若是加鎖失敗,說明改記錄正在被修改,此時須要等待或者拋出異常
  3. 若是成功加鎖,對記錄進行操做,事務完成進行解鎖

B:優勢與不足

  1. 安全性高,效率低,加鎖帶來額外開銷,產生死鎖問題
  2. 假如是自讀型事務,不必要鎖,增長系統負載
  3. 下降並行性,此事務在操做時鎖定了那行,其餘事務必須等待其完成才能處理那行

c:實例

set autocommit=0;

# 設置完autocommit後,咱們就能夠執行咱們的正常業務了。具體以下:

# 1. 開始事務

begin;/begin work;/start transaction; (三者選一就能夠)

# 2. 查詢表信息

select status from TABLE where id=1 for update;

# 3. 插入一條數據

insert into TABLE (id,value) values (2,2);

# 4. 修改數據爲

update TABLE set value=2 where id=1;

# 5. 提交事務

commit;/commit work;

複製代碼

樂觀鎖

A:執行流程

  1. 樂觀鎖認爲多用戶併發不會彼此相互影響
  2. 樂觀鎖在每次數據更新時,會檢查其餘事務是否修改該數據,有則回滾

B:優勢與不足

  1. 樂觀鎖是提交數據時鎖定,不會產生任何鎖和死鎖,可是若是兩個數據同時修改返回數據庫,就會產生意想不到的問題

c:實例

  • 記錄數據版本號,或者時間戳實現樂觀鎖
update TABLE
  set value=2,version=version+1
  where id=#{id} and version=#{version};
複製代碼

死鎖

A:問題描述

  1. 死鎖是指兩個或兩個以上的進程在執行過程當中,因爭奪資源而形成的一種互相等待的現象
  2. 若是無外力協助,永遠分配不到資源而沒法進行下去

B:解決方案

第一種:
mysql

  1. 查詢是否鎖表
show OPEN TABLES where In_use > 0;
複製代碼
  1. 查詢進程(若是您有SUPER權限,您能夠看到全部線程。不然,您只能看到您本身的線程)
show processlist
複製代碼

3.殺死進程id(就是上面命令的id列)sql

kill id
複製代碼

第二種:
數據庫

  1. 查看當前的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
複製代碼
  1. 查看當前鎖定的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
複製代碼
  1. 查看當前等鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 
複製代碼

下列方法有助於最大限度地下降死鎖

1.  按同一順序訪問對象。
2.  避免事務中的用戶交互。
3.  保持事務簡短並在一個批處理中。
4.  使用低隔離級別。
5.  使用綁定鏈接
複製代碼



參考掘金大佬博客

相關文章
相關標籤/搜索