1. select … for update
只允许当前 session 对已经存在的数据进行更新,但其它 session 仍可以进行 insert 的操作
1 | /*表示全表锁定*/ |
2. select … for update of ...
常用于多表操作时,仅对特定数据表进行锁定
1 | /*表示对表1的pkid加锁*/ |
3. select … for update wait```与```select … for update nowait
如果不使用nowait
或wait
子句, 新的加锁请求会一直 hang 住, 直到原来的 commit 或 rollback,否则,当发现请求加锁资源被锁定未释放的时候,直接报错返回
1 | /*不等待,直接报错*/ |
4. for update skip lock
尝试加锁之前判断记录是否已锁定,若已锁定,这跳过该记录
5. 注意
- 单表查询时,
for update
与select … for update of ...
是一样的,多表查询时,仅锁定of
后列所在的表