SELECT uid,NAME FROM USER WHERE uid = '1' LOCK IN SHARE MODE; 这时候事务先不commit,开启的另一个数据库,同样执行上面两个sql,会发现,不管有没有执行commit,都能够查询,不会阻塞,这就是共享锁。
SELECT ... LOCK IN SHARE MODE用于在查询数据时获取共享锁,防止其他事务对数据进行写操作,但允许其他事务对数据进行读操作。即使用该语句时,会在读取的数据行上设置共享模式锁定,其他会话可以读取这些行,但在当前事务提交之前其他事务不能对其进行修改。
通过该案例可知lock in share mode的方式在这个场景中不适用,我们需要使用for update的方式直接加X锁,从而短暂地阻塞session2的select...for update操作;以下是操作范例 session1mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from test_jjj for update;+---+---+| id | name |+--...
在业务场景中,如果两个事务都使用lock in share mode,然后进行更新操作。如两个事务都获取了共享锁,在释放锁(commit或者roll back)之前都去执行update,由于update操作需要等待对方释放锁,就造成了死锁(deadlock),这是业务不允许的,所以一般使用FOR UPDATE让事务获取独占锁,完成事务后,才允许其他事务获取锁。 注意: ...
上面的例子可以看出使用lock in share mode比较危险,很可能因为其他session同时加了这种锁,导致当前session无法进行更新,进而阻塞住。 2. select for update select for update加的是排它锁,所以没有上面lock in share mode所产生的死锁,因为一个session加了这种锁,其他session除了读取操作,其他操作都不能进行,如更改...
如果不存在一致性非锁定读的话,那么其他session是无法读取和修改这些记录的,但是innodb有非锁定读(快照读并不需要加锁),for update之后并不会阻塞其他session的快照读取操作,除了select ...lock in share mode和select ... for update这种显示加锁的查询操作。
简介:《深入理解共享锁lock in share mode排他锁for update区别》 共享锁:又称读锁(lock in share mode),例如select,当上锁之后,另一个线程只可以读,不可以修改。 排他锁:又称写锁(for update),例如update,insert,delete,上锁之后,另一个线程不可以读和修改。
共享锁 (lock in share mode) 简介 允许不同事务之前共享加锁读取,但不允许其它事务修改或者加入排他锁 如果有修改必须等待一个事务提交完成,才可以执行,容易出现死锁 共享锁事务之间的读取 session1: start transaction; select * from test where id = 1 lock in share mode; session2: start transaction; ...
相同点:1.两者都会对并发的操作造成阻塞,等待A操作完成; 2.查询操作不会造成阻塞(不带for update) 3.操作阻塞(带for update) 不同点:并发时for update会使B一直阻塞,等待A操作完成后执行B操作; 而在使用lock in share mode下当B阻塞时,如果A继续有修改数据,那么此时B会终止失败 ...
一、SELECT ... LOCK IN SHARE MODE在查询到的行上设置共享锁。其他回话可以读取到这些行,但是不能修改这些行,直到提交事务后。 如果将LOCK IN SHARE MODE用在支持页锁或行锁的存储引擎上,查询所覆盖的行会被加上共享锁,共享锁允许其他事务读,但是不允许其他事务更新或删除这些行。