表级锁:开销小,加锁快;不会出现死锁;锁力度大,发生锁冲突的几率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁,锁力度最小,发生锁冲突的几率最低,并发度最高。
页面锁:开销和加锁时间介于表锁和行锁之间,会出现死锁,锁力度介于表锁和行锁之间,并发度一般。
MyISAM引擎的锁
1、表共享读锁
添加共享读锁的语法:lock table 表名 read;
开启session1 和session2,
session1:中给表A添加共享读锁 lock table A read;
session2:执行update A set id1=2 where id=1;(等待) insert语句同样等待
session2:执行select from A;(正常)
session2:执行select from B(正常)
session1:执行select from A;(正常)
session1:执行insert into A values(2,2);(报错)
session1:执行update A set id1=2 where id=1;(报错)
session1:执行A表添加别名select也会报错如:select aa. from A as aa(报错)
session1:执行其他表的select update insert (报错)
2、表独占写锁
添加独占写锁语句:lock table 表名 write;
开启session1和session2
session1:中给表A添加独占写锁 lock table A WRITE;
session1: insert into A values(4,3,3);(成功)
session1: update A set id1=4 where id=4;(成功)
session1: select from A;(成功)
session2: select from A;(等待)
session2:insert into A values(4,3,3);(等待)
session2: update A set id1=4 where id=4;(等待)
session2: update B set id1=4 where id=4;(成功)
session1:update B set id1=4 where id=4;(失败)
session1: select from B;(失败)
*session2:select update 非被加锁表都可以执行成功
总结
1、Myisam的读锁操作不会堵塞其他用户对当前表的读操作,但会堵塞同一张表的写操作;
2、Myisam的读操作,不会堵塞当前session对表的读,当对表进行修改会报错。
3、一个session使用 lock table 命令给表A添加了读锁,这个sessionk可以查询锁定表的记录,更新和访问其他表提示错误
4、另一个sessoin可以查询表中记录但是更新和修改出现等待。
5、Myisam的写操作,则会阻塞其他用户对同一表进行查询和修改。
6、Myisam的写操作,当前session可以对表做CRUD操作,对其他表进行操作会报错。
Innodb
1、行锁
共享锁,读锁。当一个事务对某几行上读锁,允许其他事务对这几行数据进行读操作,但是不可进行写操作及不可以添加写锁,但是可以添加读锁。
上共享锁的语法:lock in share mode
例如:select from 表 where 条件 lock in share mode
排它锁,写锁。当一个事务对某几行上写锁,不允许其他事务写,但允许读,更不允许其他事务对这几行数据上任何锁。
上排它锁的语法 for update
例如:select from 表 where 条件 for update
注意:
1、两个事务不能同时锁一个索引
2、insert delete update 操作时会自动添加上排它锁
3、必须有索引才能实现行锁,否则自动全表扫描。
2、表锁
与myisam差别不大
