关于mysql:MySQL中悲观锁和乐观锁到底是什么

5次阅读

共计 1570 个字符,预计需要花费 4 分钟才能阅读完成。

索引和锁是数据库中的两个外围知识点,隔离级别的实现都是通过锁来实现的

依照锁颗粒对锁进行划分?

锁用来对数据进行锁定,咱们能够从锁定对象的粒度大小来对锁进行划分,别离为行锁、页锁和表锁。

  • 行锁就是依照行的粒度对数据进行锁定。锁定力度小,产生锁抵触概率低,能够实现的并发度高,然而对于锁的开销比拟大,加锁会比较慢,容易呈现死锁状况。
  • 页锁就是在页的粒度上进行锁定,锁定的数据资源比行锁要多,因为一个页中能够有多个行记录。当咱们应用页锁的时候,会呈现数据节约的景象,但这样的节约最多也就是一个页上的数据行。页锁的开销介于表锁和行锁之间,会呈现死锁。锁定粒度介于表锁和行锁之间,并发度个别。
  • 表锁就是对数据表进行锁定,锁定粒度很大,同时产生锁抵触的概率也会较高,数据拜访的并发度低。不过益处在于对锁的应用开销小,加锁会很快。

还有区锁和数据库锁.

每个层级的锁数量是有限度的,因为锁会占用内存空间,锁空间的大小是无限的。当某个层级的锁数量超过了这个层级的阈值时,就会进行锁降级。锁降级就是用更大粒度的锁代替多个更小粒度的锁,比方 InnoDB 中行锁降级为表锁,这样做的益处是占用的锁空间升高了,但同时数据的并发度也降落了。

从数据库治理的角度对锁进行划分

共享锁和排它锁

  • 共享锁也叫读锁或 S 锁,共享锁锁定的资源能够被其余用户读取,但不能批改。在进行 SELECT 的时候,会将对象进行共享锁锁定,当数据读取结束之后,就会开释共享锁,这样就能够保证数据在读取时不被批改。

  • 排它锁也叫独占锁、写锁或 X 锁。排它锁锁定的数据只容许进行锁定操作的事务应用,其余事务无奈对已锁定的数据进行查问或批改。

当咱们对数据进行更新的时候,也就是 INSERT、DELETE 或者 UPDATE 的时候,数据库也会主动应用排它锁,避免其余事务对该数据行进行操作。

意向锁(Intent Lock),简略来说就是给更大一级别的空间示意外面是否曾经上过锁。

从程序员的角度对锁进行划分

乐观锁

乐观锁(Optimistic Locking) 认为对同一数据的并发操作不会总产生,属于小概率事件,不必每次都对数据上锁,也就是不采纳数据库本身的锁机制,而是通过程序来实现。在程序上,咱们能够采纳版本号机制或者工夫戳机制实现。

  • 乐观锁的版本号机制

在表中设计一个版本字段 version,第一次读的时候,会获取 version 字段的取值。而后对数据进行更新或删除操作时,会执行 UPDATE … SET version=version+1 WHERE version=version。此时如果曾经有事务对这条数据进行了更改,批改就不会胜利。

  • 乐观锁的工夫戳机制

工夫戳和版本号机制一样,也是在更新提交的时候,将以后数据的工夫戳和更新之前获得的工夫戳进行比拟,如果两者统一则更新胜利,否则就是版本抵触。

乐观锁

乐观锁(Pessimistic Locking) 也是一种思维,对数据被其余事务的批改持激进态度,会通过数据库本身的锁机制来实现,从而保证数据操作的排它性。

实用场景

  • 乐观锁适宜读操作多的场景,相对来说写的操作比拟少。它的长处在于程序实现,不存在死锁问题,不过实用场景也会绝对乐观,因为它阻止不了除了程序以外的数据库操作。
  • 乐观锁适宜写操作多的场景,因为写的操作具备排它性。采纳乐观锁的形式,能够在数据库层面阻止其余事务对该数据的操作权限,避免读 – 写和写 – 写的抵触。

总结

乐观锁和乐观锁并不是锁,而是锁的设计思维。

防止死锁的产生:

  • 如果事务波及多个表,操作比较复杂,那么能够尽量一次锁定所有的资源,而不是逐渐来获取,这样能够缩小死锁产生的概率;
  • 如果事务须要更新数据表中的大部分数据,数据表又比拟大,这时能够采纳锁降级的形式,比方将行级锁降级为表级锁,从而缩小死锁产生的概率;
  • 不同事务并发读写多张数据表,能够约定拜访表的程序,采纳雷同的程序升高死锁产生的概率

正文完
 0