mysql中的锁

先区分两个锁概念,latch和lock都是锁,但是

1.latch,属于轻量级的的锁,要求锁定的时间非常短,若时间变长,性能会变差;在InnoDB中,实现分为mutex(互斥量)和rwlock(读写锁),通常用来保证多线程对临界资源的访问,通常没有死锁的检测机制;InnoDB中的latch在不能获得锁的情况下,会先进行自旋,若自旋也不能获得锁,则进入等待状态。

2.lock,锁定的的对象是事务,用来锁定数据库中的表,页,行数据,通常在事务提交或者回滚后释放,有死锁处理机制。

锁的类型

1.共享锁

2.排它锁

它们都是行级别的锁。同时InnoDB支持多粒度的锁,这种锁允许事务的行锁和表锁同时存在,为了支持这种加锁方式,InnoDB只吃一种额外的锁,意向锁,它意味着事务想在多个层次进行加锁。意向锁分为:

1.意向共享锁

2.意向排它锁

这是表级别的锁,是为了在一个事务中表示下一行将被请求的锁类型。由于InnoDB支持的是行级别的锁,所以意向锁不会阻塞除了全表扫描以外其他的任何请求。

一致性非锁定读

是指InnoDB通过数据多版本的方式来控制当前对数据库中数据的读请求。如果读取的行正在进行delete或者update操作,则不需要等待执行完毕,释放锁。相反的,InnoDB会读取被请求数据的一个快照。快照是之前版本的数据,用来回滚事务的,而且读取快照不需要加锁,所以速度很快。这种方式极大提高了数据库的并发性,是InnoDB默认的读取方式,当然具体使用场景,还是要看事务的隔离级别。

一致性锁定读

这种模式下,select都要进行加锁,分为两种

1.select  ***********  for update  这会对待读取的行加上x锁

2.select ************ lock in share mode  这对会待读取行加上s锁

当然具体使用的场景也要看事务的隔离级别

最后说一点外键的东西

外键都知道是用来进行完整性约束检查的。InnoDB会对外键列加上索引,因为这样会避免行锁升级为表锁,从而导致死锁,这个之前文章有说过。

还有就是,对于外键值的插入或者更新,首先要查找父表中的记录,然后加上select *****  lock in share mode,如果不这样操作,可能会导致父子表数据不一致。

你可能感兴趣的:(数据库)