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
@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); }
不能太過於依賴行鎖,更建議使用分佈式鎖提升效率