mysql 锁
  xwGmYGXf1w4S 2023年11月13日 27 0

1.锁机制

数据库使用锁是为了支持对共享资源进行并发访问,提供数据的一致性与完整性。

2.锁的访问分类

a.共享锁(S Lock):允许事务读一行数据

b.排他锁(X Lock):允许事务删除或更新一行数据

c.意向共享锁(IS Lock):事务想获得一张表中的某几行的共享锁

d.意向排他锁(IX Lock):事务想获得一张表中的某几行的排他锁

3.锁的粒度分类

行级锁:行级锁是一种排他锁,防止其他事务修改此行;

  在使用以下语句时,Oracle会自动应用行级锁: INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT]; SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新; 使用 COMMIT 或 ROLLBACK 语句释放锁。

  表级锁:表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

  页级锁:页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB支持页级锁

4.锁的算法

record lock:单个行记录上的锁

gap lock:间隙锁,锁定一个范围,但不包含记录本身

next-key-lock:gap lock+record lock,锁定一个范围,并且锁定记录本身

5.锁读取

a.一致性非锁定读:innodb 存储引擎通过多版本控制的方式来读取当前数据库中正在执行的数据,如果读取的行正在执行更新操作,这是读取操作不会去等待行上的锁释放,innondb 存储引擎会去读取行的一个快照数据,即历史版本,该实现是通过undo段来完成的,undo 是用来在事务中回滚数据的。对于快照数据是没有额外开销的,因此很大程度上提高了数据库的并发性。在read committed 隔离级别下,对于快照数据总是读取被锁定行的最新一份快照数据,而在repeatable read 隔离级别下,对于快照数据总是读取事务开始时的行数据版本。一个行记录可能有不止一个快照数据,由此带来的并发控制就是多版本并发控制(MVCC)

b.一致性锁定读:在某些情况下需要显示的对数据库读取操作进行加锁以保证数据逻辑的一致性,即一致性锁定读

6.阻塞

由于不同锁之间的兼容性关系,在有些时候一个事务中的锁需要等待另一个事务中的锁释放其占用的资源,这就是阻塞。阻塞并不是一件坏事,其是为了确保事务正常的运行

7.锁问题

a.脏读:在不同的事务下,当前事务可以读到另一个事务未提交的数据,简单来说就是可以读到脏数据。脏数据是指事务对缓冲池中行记录的修改,并且还没有被提交

b.不可重复读:在同一个事务内多次读取同一数据集读取到的结果不一致。脏读是读取到了未被提交的数据,而不可重复度是读取到了已提交的数据

8.死锁

是一组互相竞争资源的进程,因为互相等待导致永久阻塞的现象

导致死锁的原因:

a.互斥条件:共享资源x和y只能被一个线程占用

b.占有且等待:线程a取得共享资源x的时候,等待共享资源y的时候,不释放x

c.不可抢占:其他线程不能强行抢占线程a的资源

d.循环等待:线程a等待线程b占有的资源,线程b等待线程a占有的资源

对于死锁的处理:对于a需要打破互斥即可,一次申请所有资源。对于b申请不到的资源主动释放。对于c不可抢占,按序申请资源。对于d只能先kill 掉其中一个线程,等另一个执行完再进行下一个线程。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  xaeiTka4h8LY   2024年05月17日   48   0   0 数据库JavaSQL
  xaeiTka4h8LY   2024年05月17日   44   0   0 数据库SQL
  xaeiTka4h8LY   2024年05月17日   36   0   0 MySQL数据库
xwGmYGXf1w4S