锁分类
1.从操作的颗粒度可分为表级锁,行级锁,页级锁
表级锁: 每次操作锁住整张表,锁定颗粒度打,发生冲突该路最高,并发度最低,应用再myisam,innodb,bdb等存储引擎中。
行级锁: 每次操作锁住一行数据,锁定颗粒度最小,发生冲突概率最低,并发度最高,应用于innodb
页级锁: 每次锁定相邻一组记录,锁定颗粒度介于锁表和锁行之间,开销和加索时间介于表锁和行锁之间,并发度一般,应用bdb引擎中
2.从操作的类型可分为读锁和写锁
读锁(s锁): 共享锁, 针对同一份数据,多个读操作可以同时进行而不相互影响。
写锁(x锁): 排他锁,当前写操作没有完成前,他会阻断其他写锁和读锁。
ls锁,lx锁: 意向读锁,意向写锁,属于表级锁,s和x主要针对行级锁,再对表记录添加s或x锁之前,会先对表添加ls或lx锁;
s锁: 事务a对记录添加s锁,可以记录进行读操作,不能做修改,其他事务可以多该记录追加s锁但不能追加x锁,需要等记录的s锁全部释放。
x锁: 事务a 对记录添加x锁,可以对记录进行读和修改操作,其他是不不能对记录做读写操作
3.从操作的性能可分为乐观锁和悲观锁
乐观锁:
共享锁(行级锁+读锁)
共享锁又称读锁,简称s锁,共享锁就是多个事务对同一数据可以共享一把锁,都能访问到数据,但只能读不能修改,使用共享锁的方法时select…lock in share mode 只是用于查询。
总结: “事务” 中使用了共享锁(读锁),只能读取,不能修改,修改操作被堵塞;
排他锁(行级锁+写锁)
排他锁又称写锁,简称x锁,排他锁就是不能和其他锁并存,如一个事务获取一个数据行的排他锁,其他事务不能对该行记录做其他操作,也不能获取该行的锁。
使用排他锁的方法是在sql末尾加上for update, innodb引擎默认会在update,delete语句加上for update,行级锁的实现其实时依赖其对应的索引,所以如果操作没用到索引的查询,那么会锁住全表记录。
总结 事务使用排他锁(写锁),当事务可以读取和修改,其他事务不能修改,也不能获取记录锁(select … for update),如果查询没有使用索引,将会锁住整个表记录。
乐观锁
新增version字段控制更新 version=1
更新操作a:update employee set ename = ‘校长’ version = version+1 where eid =1 and version = 1;
b更新将找不到version字段就知道已经更新过啦