mysql锁

想要了解锁,必须要知道mysql事务,以及mysql事务产生的并发问题

数据库中的事务,隔离级别,以及数据展示_華同学.的博客-CSDN博客

1.Mysql锁的介绍


锁是计算机协调多个线程或进程并发访问某一资源的机制。除传统的计算机资源(CPU,RAM,I/O)的争用,数据也是一种提供许多用户共享的资源。如何保证数据并发访问的一致性,有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。

2.全局锁

MySQL 的全局锁是一种特殊的锁,它可以锁住整个数据库实例,防止其他线程对数据库进行任何修改操作。全局锁可以用来保证数据备份的一致性,因为在备份的过程中,需要保证数据库的数据不发生变化。

在 MySQL 中,可以使用 FLUSH TABLES WITH READ LOCK 命令来获取全局锁。执行这个命令后,所有的表都会被锁住,只有当前线程可以进行读操作,其他线程无法进行任何修改操作(修改不行,读行)。当备份完成后,可以使用 UNLOCK TABLES 命令释放全局锁。 

 语句:

MySQL 提供了多种全局锁定方式,包括:

  1. FLUSH TABLES WITH READ LOCK:该语句可以锁定所有表,并防止其他线程对表进行写操作,但允许其他线程进行读操作。

  2. FLUSH TABLES WITH READ LOCK AND DISABLE CHECKPOINT:该语句可以锁定所有表,并防止其他线程对表进行写操作,但允许其他线程进行读操作。此外,该语句还可以禁用检查点,以提高性能。

  3. LOCK TABLES:(表锁)该语句可以锁定指定的表,并防止其他线程对表进行读写操作。

演示:

开启两个客户端,一个加上全局锁,另一个可以进行读取操作,但是不能够修改 (会阻塞,知道UNLOCK TABLES解锁)

 修改操作,阻塞状态

 2.表级锁

表级锁,每次操作整张表,锁定粒度大,发生锁冲突的概率高,并发度低

主要分为以下三类:

1.表锁

2.元数据锁(meta data lock,mdl)

3.意向锁

1.表锁:

1.表共享读锁(读锁)

2.表独占写锁 (写锁)(排他锁)

语法:

1.加锁:lock tables 表名 ..read/write.

2.释放锁:unlock tables / 客户端断开连接

 1.表共享读锁:

 当客户端1:加上表读锁,所有客户端都是可以进行读取的,但不能写(自己也不行)

 

 可见,加上表共享读锁:自己和其他线程都可以进行读操作,但是自己写的话报错,(表‘my_table’加上读锁并且不能修改),其他客户端写形成堵塞状态!

 2.表独占写锁

 

 客户端1自己能够读和写,但是客户端2读的话就会进行阻塞,更别说些了。

 

 2.元数据锁(meta data lock,mdl)

 元数据锁:MDL加锁过程是系统自动控制,不用显示使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免DML与DDL(进行定义/改变表的结构、数据类型、表之间的链接等操作)冲突,保证读写的正确性。

 元数据锁是一种特殊的锁定类型,用于锁定数据库对象的元数据信息,例如表格结构、索引等。元数据锁可用于管理并发 DDL 操作,以确保这些操作的原子性和一致性。与表级锁不同,元数据锁的作用范围更广,可以覆盖多个表格或数据库对象

 1.MDL_SHARED_READ

该级别的锁允许多个会话同时读取一个对象,并防止其他会话更改该对象的结构或元数据。如果另一个会话想要修改该对象,则必须等待之前的锁被释放

2.MDL_SHARED_WRITE

该级别的锁允许一个会话向一个对象添加新的读锁,但同时防止其他会话更改该对象的结构或元数据。如果另一个会话想要修改该对象,则必须等待最后一个读锁被释放。

3.MDL_EXCLUSIVE

该级别的锁只允许一个会话独占一个对象,并防止其他会话读取或修改该对象的结构或元数据。如果另一个会话想要获取该对象的任何类型的锁,则必须等待独占锁被释放。

在使用元数据锁时,需要注意以下几点:

  1. 元数据锁是自动管理的,不需要手动获取或释放。系统会根据需要自动获取和释放锁定。
  2. 与表级锁不同,元数据锁不会阻止读取操作。多个会话可以同时读取一个对象,并且他们之间不会产生冲突。
  3. 元数据锁可能会影响性能,尤其是在进行大量并发 DDL 操作时(基本不会,都设计好了)。因此,在设计数据库架构时,应该考虑将 DDL 操作限制到必要的最小集合中。

 元数据锁详解MySQL 元数据锁(MDL)_Leon_Jinhai_Sun的博客-CSDN博客

3.意向锁

 首先:客户端1开启一个事务:里边修改了一条数据,但是没有提交(修改一条数据,会自动加上行锁),但是客户端2进行了表锁,锁住了整张表,添加表锁(读/写)前,会自动逐一行排查有没有行锁,(这种客户端效率很慢),所以:客户端1在添加行锁的同时会添加意向锁,那么客户端2就会直接判断意向锁(不用逐一排查)。

 

 意向锁(Intention Locks)是 MySQL 中的一种锁定机制,用于管理事务中多个对象之间的关系,并确保并发访问的正确性。意向锁是表级锁和行级锁之间的一个桥梁,它向其他会话显示当前会话将要获取的锁类型,以防止死锁或不必要的等待。

1.意向共享锁(IS): 与表锁共享锁(read)兼容(我读,你们也可以读)

                                    与表锁排它锁(write)互斥(我读,你们就不能写·)

2.意向排他锁(IX): 与表锁共享(read)以及排它锁(read)都互斥。(我写,你读写都不行)

                                       意向锁之间不会互斥(我写,你也可以写,看谁写的快)

 select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;

1. 意向共享锁(Intention Shared Lock,IS)

它表示当前会话将要获取一个共享锁,但不会阻止其他会话获取这个锁类型。意向共享锁通常用于管理多个事务之间的关系,并确保并发操作的正确性。

2.意向排他锁(Intention Exclusive Lock,IX)

 意向排他锁表示当前会话将要获取一个独占锁,并且可能会阻止其他会话获取相同的或更低级别的锁。如果已经有任何类型的锁,则无法获取意向排它锁。

在使用意向锁时,需要注意以下几点:

  1. 意向锁不会直接锁定任何对象,而只是告诉其他会话当前会话要获取哪种类型的锁
  2. 意向锁是自动管理的,不需要手动获取或释放。系统会根据需要自动获取和释放锁定
  3. 意向锁可以减少死锁的发生,因为它向其他会话显示当前会话将要获取的锁类型,从而使其他会话能够更好地协调并避免产生冲突。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

華同学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值