在当前事务中包含select.......lock in share mode时,就是所谓的共享锁,就是确保某行记录存在,在该事务获得共享锁的同时,其他事务也可以获得共享锁。如果在这个时候某个事务开始进行跟新操作,这个事务会等待,如果这个时候有其他事务也进行更新操作,则会造成死锁,系统会直接干掉后面的,按照第一个进行更新。
在事务中如果一个事务获得排他锁,则这个时候其他事务都不能获得排他锁,当获得排他锁的事务完成更新操作以后,其他事务才可以获得。
当两个事务同时包含lock in share mode的时候,并且涉及当相同的记录时会产生死锁,mysql会自动检测并且将第二个直接干掉,这个就是select ... lock in share mode和select...for update的区别,lock in share mode允许不排斥lock in share mode,for update排斥一切。
在默认情况下,InnoDB数据表驱动程序在遇到带有范围条件表达式(比如where id>100 或 where id between 100 and 200)的select ... lock in share mode、select ... for update 、update、delete命令还会给他们加上一把防插入锁(gap and next key lock),将锁住符合条件的现在或者将来的记录。
innodb行锁是通过给索引上的索引项加锁来实现的,这与oracle是不同的,oracle是通过在数据块中对相应的数据块加锁来实现的,这就意味着只用通过索引条件检索数据,innodb才使用行级锁,否则使用表锁。不注意这点会导致大量的锁冲突。
防插入锁或者说是间隙锁,看例子,如果在一个表中有100条记录id分飞1-100,这时候我们用select * from table_name where id>99 for update;这个时候innodb不仅会为id为100的记录加锁也会为id大于100的记录加锁,虽然这些记录并不存在,这是为了防止这时候有用户插入符合条件的值。这时其他事务不能插如那些符合刚才检索条件的记录,只有等到锁释放以后,才可以插入。
在事务中如果一个事务获得排他锁,则这个时候其他事务都不能获得排他锁,当获得排他锁的事务完成更新操作以后,其他事务才可以获得。
当两个事务同时包含lock in share mode的时候,并且涉及当相同的记录时会产生死锁,mysql会自动检测并且将第二个直接干掉,这个就是select ... lock in share mode和select...for update的区别,lock in share mode允许不排斥lock in share mode,for update排斥一切。
在默认情况下,InnoDB数据表驱动程序在遇到带有范围条件表达式(比如where id>100 或 where id between 100 and 200)的select ... lock in share mode、select ... for update 、update、delete命令还会给他们加上一把防插入锁(gap and next key lock),将锁住符合条件的现在或者将来的记录。
innodb行锁是通过给索引上的索引项加锁来实现的,这与oracle是不同的,oracle是通过在数据块中对相应的数据块加锁来实现的,这就意味着只用通过索引条件检索数据,innodb才使用行级锁,否则使用表锁。不注意这点会导致大量的锁冲突。
防插入锁或者说是间隙锁,看例子,如果在一个表中有100条记录id分飞1-100,这时候我们用select * from table_name where id>99 for update;这个时候innodb不仅会为id为100的记录加锁也会为id大于100的记录加锁,虽然这些记录并不存在,这是为了防止这时候有用户插入符合条件的值。这时其他事务不能插如那些符合刚才检索条件的记录,只有等到锁释放以后,才可以插入。