语法
SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
of 选定要锁的某列
wait n 等待时间
nowait 不等待
skip locked 跳过锁,也就是不会报资源忙的异常
环境
CREATE TABLE `stttest` (
`id` bigint(200) NOT NULL DEFAULT '0',
`data` varchar(200) NOT NULL DEFAULT '0',
`alter_size` bigint(100) unsigned NOT NULL DEFAULT '0',
`alter` bigint(100) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
在窗口A 执行: begin ; select * from stttest where id=1;
锁
在窗口二执行:
- 当where后面的条件是主键等值,并且查询有结果时为行锁(锁定查询的行)
例如:
select * from stttest where id=1 for update ;
- 当指定主键但是查询没有结果的时候,没有锁
例如:
select * from stttest where id=5 for update ;(没有id=5 的结果)
- 当模糊匹配主键并且结果有值的时候,表级别锁
例如:
select * from stttest where id>1 for update ;
select * from stttest where id like 1 for update ;
- 当where 后面的不是主键的时候,表级别锁
例如:
select * from stttest where data='aaa' for update ;
参数
在窗口二执行:
- wait 参数
例如:
select * from stttest where id=1 for update wait 6 ; 在等待6秒后,报资源忙的异常
select * from stttest where id=1 for update nowait ;不等待直接报资源忙的异常
- skip lock
例如:
select * from stttest where id=5 for update nowait skip lock ;不等待并且不报资源忙的异常 3. of 参数
select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。