表锁:
不会出现死锁,发生锁的冲突几率高,并发性低。
存储引擎在进行SQL数据读写请求前,会对涉及到的表进行加锁。
其中锁分为共享读锁和独占写锁:读锁会阻塞写,写锁会阻塞读和写。
行级锁:
会出现死锁,发生锁的冲突几率低,并发性高。
InnoDB引擎支持行锁,与Oracle不同,MySQL的行锁是通过索引加载的,也就是说,行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表锁,此时其它事务无法对当前表进行更新或插入操作。
行级锁注意事项:
行级锁必须有索引才能实现,否则会自动锁全表,那就不是行锁了。
两个事务不能锁同一个索引。
insert,delete,update在事务中都会自动默认加上排它锁。
行锁的适用场景:
避免不可重复读的场景。