select * from table where for update 学习

语法

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 

select * from table where for update 学习_第1张图片

在窗口A 执行: begin ; select * from stttest where id=1;

在窗口二执行:

  1. 当where后面的条件是主键等值,并且查询有结果时为行锁(锁定查询的行)

例如:

select * from stttest where id=1 for update ;

  1. 当指定主键但是查询没有结果的时候,没有锁

例如:

select * from stttest where id=5 for update ;(没有id=5 的结果)

  1. 当模糊匹配主键并且结果有值的时候,表级别锁

例如:

select * from stttest where id>1 for update ;

select * from stttest where id like 1 for update ;

  1. 当where 后面的不是主键的时候,表级别锁

例如:

select * from stttest where data='aaa' for update ;

参数

在窗口二执行:

  1. wait 参数

例如:

select * from stttest where id=1 for update wait 6 ; 在等待6秒后,报资源忙的异常

select * from stttest where id=1 for update nowait ;不等待直接报资源忙的异常

  1. skip lock

例如:

select * from stttest where id=5 for update nowait skip lock ;不等待并且不报资源忙的异常 3. of 参数

select for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定,若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。

转载于:https://my.oschina.net/tingting1127723365/blog/839209

你可能感兴趣的:(select * from table where for update 学习)