Mysql 行鎖 for update

Mysql 只有Innodb支持行鎖java

使用行鎖須要 事務支持mysql

首先打開兩個 mysql-clientsql

分別執行分佈式

- client1
select * from my_entity1 for update;
- client2
select * from my_entity1 for update;

發現行鎖無效,說明須要事務支持spa

- client1
start transaction;
select * from my_entity1 for update;
- client2
select * from my_entity1 for update;

這個時候 client2 阻塞等待鎖code

此時給client1 輸入 commit; client2得到鎖而且獲取結果事務

若是client2 不加行鎖也是不會被阻塞的ip

除此以外 forupdate還有其餘方法it

select * from t for update 會等待行鎖釋放以後,返回查詢結果。 select * from t for update nowait 不等待行鎖釋放,提示鎖衝突,不返回結果 select * from t for update wait 5 等待5秒,若行鎖仍未釋放,則提示鎖衝突,不返回結果 select * from t for update skip locked 查詢返回查詢結果,但忽略有行鎖的記錄io

Spring jpa 行鎖

  1. 對調用的service 加 @Transaction註解
  2. 使用 @Query 原生sql註解
@Transactional
public void updateLockTester()
public interface Entity2Dao extends JpaRepository<MyEntity2, Long> {
    List<MyEntity2> findAllByTagEquals(Integer tag);

    @Query(value = "select * from my_entity2 where tag = :tag for update", nativeQuery = true)
    List<MyEntity2> findAllByTag2Equals(@Param("tag") Integer tag);
}

不能太過於依賴行鎖,更建議使用分佈式鎖提升效率

相關文章
相關標籤/搜索