事務與鎖的關係
1、事務與鎖是不同的。事務具有ACID(原子性、一致性、隔離性和持久性),鎖是用於解決隔離性的一種機制。
2、事務的隔離級別通過鎖的機制來實現。另外鎖有不同的粒度,同時事務也是有不同的隔離級別的。
3、開啓事務就自動加鎖。
行級鎖:
共享鎖(s):又稱讀鎖。允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖。若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
排他鎖(X):又稱寫鎖。允許獲取排他鎖的事務更新數據,阻止其他事務取得相同的數據集共享讀鎖和排他寫鎖。若事務T對數據對象A加上X鎖,事務T可以讀A也可以修改A,其他事務不能再對A加任何鎖,直到T釋放A上的鎖。
mysql InnoDB引擎默認的修改查詢數據語句:
update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型;
加排他鎖可以使用select …for update語句,加共享鎖可以使用select … lock in share mode語句;
select for update 獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。
加過排他鎖的數據行在其他事務中是不能修改數據的,也不能通過for update和lock in share mode鎖的方式查詢數據,但可以直接通過select …from…查詢數據,因爲普通查詢沒有任何鎖機制。