Lmxy1990 ' Blog

MySQL 锁

概述


数据库锁,是为了支持对共享资源进行并发访问,保持数据一致性,完整性的一个特性.
与程序锁的概念类似.

innoDB锁类型


共享锁(S):容许事物读取一行数据.

排它锁(X):容许事物删除或更新一行数据.

意向共享锁(IS):

意向排它锁(IX):

读取操作,使用共享锁.对于update操作,采用排它锁.

锁获取


事物获取共享锁的条件:该行不存在排它锁.(可以存在共享锁)

事物获取排它锁的条件:该行没有共享锁,也没有排它锁.

S锁获取流程 : 是否有X锁,如果有.则需要等待X锁释放后加S锁.
X锁获取流程 : 是否存在X/S锁,如果有,则等待释放,然后加X锁.

一致性非锁定读.


InnoDB 默认的读取操作,采用的是一致性非锁定读.也就是说,在读取数据时,不考虑当前数据是否被加锁.如果该行被锁定,则返回该行历史版本的最新一个版本.否则返回该行数据.一致性非锁定读,极大提升数据库的并发读的性能.

共享锁读数据


一致性非锁定读性能极大提升,但是某些时候.需要数据的完整性,而不是获取历史快照.是希望取到最新的数据.这时候,就需要采用共享锁了.

操作:
SELECT * FROM TABLE WHERE ID = 1 FOR UPDATE 给该行加上一个X锁.

SELECT * FROM TABLE WHERE id = 1 LOCK IN SHARE MODE 给该行加上一个S锁.

特别注意:加锁需要在事物之中,事物提交.锁释放.


End

坚持原创技术分享,您的支持将鼓励我继续创作!