在Mysql中,Innodb数据引擎支持行锁和表锁,Myisam数据引擎只支持表锁
1 行锁和表锁
行锁是通过索引加载的,行锁是加在索引字段上的,如果该Sql语句没有使用索引,则会造成全表扫描使用表锁.
锁冲突:例如说事务A将某几行上锁后,事务B又对其上锁,锁不能共存否则会出现锁冲突。(但是共享锁可以共存,共享锁和排它锁不能共存,排它锁和排他锁也不可以) 死锁:例如说两个事务,事务A锁住了1~5行,同时事务B锁住了6~10行,此时事务A请求锁住6~10行,就会阻塞直到事务B施放6~10行的锁,而随后事务B又请求锁住1~5行,事务B也阻塞直到事务A释放1~5行的锁。死锁发生时,会产生Deadlock错误。
表锁: 不会出现死锁,发生锁冲突的几率高,并发低
行锁: 会出现死锁,发生锁冲突的几率低,并发高.
2 行锁的类型
行锁分共享锁和排它锁
共享锁(读锁): 当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但不允许其进行写操作,也不允许其他事物给这几行上排它锁,但允许上读锁.
排它锁(写锁): 当一个事务对某几行上写锁时,不予许其他事务写,但允许读,更不允许其他事务给这几行上任何锁,包括写锁.
上共享锁的写法:select math from zje where math>60 lock in share mode;
上排它锁的写法:select math from zje where math >60 for update;
3 行锁的实现
行锁必须使用索引才可以,否则会自动锁全表
两个事务不能锁同一个索引
insert ,delete , update在事务中都会自动默认加上排它锁
网友评论