0%

mysql锁

锁的作用
​ 锁是为了控制对共享资源的并发访问和操作。数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。
两种锁的概念:

  • Latch:闩锁,这是一种轻量级锁,用于线程中的临界资源的操作【例如,操作缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入】。锁定的时间非常短,而且没有死锁检测机制。

  • lock:用于数据事务的锁,并且在一般在commit和rollback后释放。有死锁检测机制。

    锁的类型
    ​ 表锁:myisam 锁
    ​ 共享锁:允许事物读取一行数据【S锁】
    ​ 排它锁:允许事物更新或是删除一条数据【X锁】
    myIsam对于并发操作处理方式:
    ​ MySQL对于删除和插入的处理,对于删除操作,myisam只是标记这行被删除,并没有真正的去作删除处理。在插入的时候回看看有没有标记的删除的行【成为空洞】,如果有会填补这些空洞,没有会插入到行末尾。
    尽管myisam是表锁,但是也指出并发的读,并发插入的操作,读只能读取到当前的数据,新插入的数据是看不见的,这避免了非一致读问题。但是中间有些数据改动的话还是不支持非一致读。
    通过设置concurrent_insert这个人值,可以改变myisam的插入并发的控制。

    • 0:MySQL不支持并发插入,所有插入都会设置互斥锁。

    • 1:默认值,如果没有空洞就指出并发插入。

    • 2:所有的并发插入都设置在表尾部。

Innodb:

  • 共享锁【S锁】
    对于共享锁,支持对于一行加了S锁,可以在加s锁,但是不支持加X锁。
  • 排它锁【X锁】
    对于排它锁,加了排它锁的行,不支持在加任何其他锁