有些情况下为了保证数据逻辑的一致性,需要对SELECT的操作加锁。InnoDB存储引擎对于SELECT语句支持两种一致性的锁定读(locking read)操作。
1、 SELECT …… FOR UPDATE 2、 SELECT …… LOCK IN SHARE MODE
其中,SELECT …… FOR UPDATE对读取的记录加一个锁,其他事务不能对已锁定的行加任何锁。而SELECT …… LOCK IN SHARE MODE也是对读取的记录加一个锁。
但是如果有另一个一致性非锁定读的操作来读取该行那么数据是不会阻塞的,读取的是改行的快照版本(也就是指改行之前的数据版本,也就会出现脏读,所以也称为非锁定读,因为不需要等待被访问行的锁的释放。非锁定读的方式极大提高了数据库的并发性。在InnoDB存储引擎中,这是默认的读取方式)
SELECT …… FOR UPDATE和SELECT …… LOCK IN SHARE MODE必须在一个事务中,当一个事务提交了,锁就释放了。因此在使用这两个SELECT锁定语句时,必须开启事务。