MyISAM默认使用的是表级锁,不支持行级锁
当我们操作的表使用的是MyISAM引擎,这个时候我们对同一张表进行查询操作的时候,需要十秒那么再在这十秒内其他的SQL语句要想对这张表进行写操作的话就会被阻塞,一直要等到这十秒结束才能去进行操作。
这样的锁叫做共享锁。
在MyISAM引擎中在查询语句执行过程中,不会影响其他用户对于表的查询,但在查询过程中不能对表进行写操作。
并且也不只是有读才有共享锁(读锁),MyISAM进行写操作的时候会生成排它锁(写锁)。
排它锁(写锁)就是说当在对一张MyISAM引擎表进行写操作的同时无法对表进行任何其他的操作,直到写操作结束之后才能执行。
对表加了共享锁之后还可以加共享锁但是不能加排它锁。
InnoDB默认用的是行级锁,也支持表级锁
InnoDB引擎是支持事务的,通过session暂时取消自动提交方式模拟并发访问的过程。
下面发生的情况都是基于不自动提交的情况(set autocommit = 0即可把当前session的自动提交取消),取消自动提交之后就需要手动进行加锁,如果不取消自动提交的话,SQL默认自动执行begin/start transaction和commit去开启和关闭事务。
InnoDB内部加锁默认是二段锁,就是说分为加锁和解锁的过程。在开启事务之前统一进行加锁,加锁方式就是lock in share mode为手动加共享锁,for update是手动加排它锁,commit之后统一进行解锁。
如select * from < tableName> where id = 1 lock in share mode这样就是对这一行加了读锁,只要不执行commit那么这行就会被一直锁下去,其他语句只能对这一行进行读(加共享锁),无法加排它锁。
select * from < tableName> where id = 1 for update会自动加上排它锁,前提是这一行没有加过共享锁,道理和MyISAM一样,直到执行commit之后锁才会被释放。