全局锁、表级锁和行锁
三类。全局锁主要应用于做全库逻辑备份
。这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。
缺点:
解决办法
表共享读锁和表独占写锁
表级自增锁
,当为表的某一列添加AUTO_INCREAMENT属性后,插入数据可以不指定该字段,系统会自动为它赋值。此时获取自增值是需要AUTO_INC锁锁定的InnoDB 牛逼的地方在于实现了颗粒度更细的行级锁。
如果出现行锁的时候,想加表锁,那就只能进行全表遍历,看是否有加行锁。太浪费时间
意向锁是则不需要进行遍历数据也可以直接判断是否可以给表加锁
。
意向共享锁(IS锁)
:当事务给某行记录增加了S锁(共享锁),同时给表加一个IS锁意向独占锁(IX锁)
:当事务给某条记录增加X锁时(独占锁),同时给表加一个IX锁。意向共享锁和意向独占锁是表级锁,不会和行级的共享锁和独占锁发生冲突,>而且意向锁之间也不会发生冲突,只会和共享表锁(lock tables … read)和独占表锁(lock tables … write)发生冲突。
行锁
开销大,会出现死锁,发生冲突几率小,并发高但是如果一个SQL语句没有走任何索引,那么就会为它加上表锁,全表扫描。
共享锁(读锁也叫S锁)/排他锁(写锁也叫X锁)
共享锁(S锁)
:当一个事务给一条记录上共享锁后,其他的事务也可以对该事务上共享锁,但是该锁只是可以读,如果有事务想写,那么它就会阻塞,一直等待所有的锁释放。排他锁(X锁)
:当一个事务给记录上锁后,可以进行读写,其他的事务不能够上任何锁。MySQL默认隔离级别是可重复读
,而可重读读只能解决脏读,不可重复读。解决不了幻读
,但是不同的一点是MySQL通过俩种机制来解决幻读:一靠MVCC方案解决,二加锁方案解决
。然而事务加锁时,记录是不存在的,是无法加行锁,则需要靠间隙锁。
一个事务在插入一条记录的时候,需要判断插入位置是否已被其他事务加了间隙锁(next-key lock 也包含间隙锁)。
如果有的话,插入操作就会发生阻塞,直到拥有间隙锁的那个事务提交为止(释放间隙锁的时刻),在此期间会生成一个插入意向锁,表明有事务想在某个区间插入新记录,但是现在处于等待状态。
插入意向锁名字虽然有意向锁,但是它并不是意向锁,它是一种特殊的间隙锁,属于行级别锁。
每次拿数据
都默认别人不会修改,所以不会上锁,在更新的时候会判断一下在此期间别人有没有去更新这个数据。
实现方式
:乐观锁一般会使用版本号机制或CAS算法实现。
MVCC (Multiversion Concurrency Control),即多版本并发控制技术。
MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁
总结
:
MVCC其本质就是看做是乐观锁的机制,而排他锁等则是悲观锁的实现。