概述
数据库锁,是为了支持对共享资源进行并发访问,保持数据一致性,完整性的一个特性.
与程序锁的概念类似.
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锁.
特别注意:加锁需要在事物之中,事物提交.锁释放.