MYSQL:InnoDB的行鎖模式及加鎖方法
共享鎖:允許一個事務度一行,阻止其他事務獲取相同數據集的排他鎖。
SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
排他鎖:允許獲取排他鎖的事務更新數據,阻止其他事務獲取相同的數據集共享讀鎖和排他寫鎖。
SELECT * FROM table_name WHERE ... FOR UPDATE
InnoDB行鎖實現方式
InnoDB行鎖是通過索引上的索引項來實現的,這一點MySQL與Oracle不同,后者是通過在數據中對相應數據行加鎖來實現的。InnoDB這種行鎖實現特點意味者:只有通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖!。
------------------------------------------------------------------------------------------------
下面是在MyBatis中如何實現行級鎖。
1.首先需要在使用行級鎖的實現層(ServiceImpl)加上事務,
serviceImple層:使用for update 一定要在方法上加上@Transactional(isolation = Isolation.READ_COMMITTED),當事務處理完后,for update 才會將行級鎖解除。
執行此方法時進行加鎖,當整個方法將事務提交后,才會解鎖。
2.Mapper,SQL使用for update 加行鎖。
經測試運行無誤。