樂觀鎖:每次去獲取數據的時候都認爲別人不會修改,不會上鎖,但是在提交修改的時候會判斷一下在此期間別人有沒有修改這個數據。
悲觀鎖:每次去獲取數據的時候都認爲別人會修改,每次都會上鎖,阻止其他線程獲取數據,直到這個鎖釋放。
MySQL 的樂觀鎖需要自己實現。一般在表裏面添加一個 version 字段,每次修改成功值加 1;每次其他字段值的時候先對比一下,自己擁有的 version 和數據庫現在的 version 是否一致,如果不一致就可以返回失敗也可以進行重試。
MySQL 的悲觀鎖,以 Innodb 存儲引擎爲例,將 MySQL 設置爲非 autoCommit 模式
begin;
select * from table where id = 1 for update;
insert ...
update ...
commit;
當上面語句未 commit,id = 1 的數據是被鎖定的,即其他事務中的查到這條語句會被阻塞,直到事務提交。
數據的鎖定還涉及到索引的不同可能是行鎖、表鎖的問題。
【Java面試題與答案】整理推薦