`
l4432848
  • 浏览: 255226 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

-mysql-锁2

    博客分类:
  • java
阅读更多

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

表级锁:

之前我们介绍了行级锁,顾名思义行级锁就只是锁住一行或多行数据,因为针对的是行去锁的,因为一个表格内会有很多行数据,要在这些数据中去锁定其中几行数据,是比较耗费资源。而表级锁则是可以锁住整个表,所以相对于行级来说没那么耗费资源,表级锁有两个模式:只读模式和只写模式,这和文件权限里的只读只写有点类似。 在一般情况下表格锁并不经常使用,在这里只是介绍一下如何使用表级锁,和解锁表级锁,而且表级锁的资料都可以在网络上查找到,所以了解一下即可,在mysql官方也有表格锁语法的文档:

https://dev.mysql.com/doc/refman/5.6/en/lock-tables.html

使用只读模式的表级锁,语法:

LOCK TABLES 表名 READ
示例:

image

我们再打开一个客户端来看看能否使用SELECT语句查询这个带有表级锁的表格的数据:

image

因为我们使用的是只读模式的表级锁,自然每个用户都可以读取、查询这个表格的数据,那么我们可以尝试一下update这会对表格数据修改的语句能否执行:

image

在行级锁里即便某些行数据被上锁了也还是能够使用insert语句插入数据的,那么我们试一下在表格锁里是否能行得通:

image

从结果可以得知在表级锁的只读模式下,是不允许任何用户对上锁的表格进行任何的修改的。

自然的delete语句也无法使用:

image

那么如何解锁呢?看看解锁时会发生什么,解锁表级锁的语法很简单:
UNLOCK TABLES
示例:

image

使用只写模式的表级锁,语法:
LOCK TABLES 表名 WRITE
示例:

image

在表级锁的只写模式里,只有上锁用户可以对表格进行写入数据,其他用户是不可以写入数据的,其他用户就连使用SELECT语句查询数据都不可以:

image

上锁用户可以使用insert语句插入数据,其他用户则不允许这个操作:

image

update语句也是一样的:

image

还有delete语句:

image

如果用户给一张表格上了表级锁,那么这个用户在给这个表格解锁之前就只能操作这个表格,数据库里的其他表格均不可以进行任何的操作,如果操作就会报错:

image

只写模式的解锁语法是一样的,都是UNLOCK TABLES:

image

总结一下表级锁,表级锁就是针对表格进行锁定,相对于行级锁没那么耗资源,表级锁有两个模式,只读模式和只写模式,只读模式下上锁用户和其他用户都只能查询数据不能写入数据,只写模式下上锁用户可以进行查询数据和写入数据,其他用户既不能查询数据,也不能写入数据,执行任何SQL语句都会进入等待状态,一直等到表格解锁为止,当表格解锁的时候在等待中的事务会马上被执行。某个用户对某个表格使用了表级锁的话,就只能操作那个表格,数据库里的其他表格均不可进行任何操作。

悲观锁:

悲观锁(Pessimistic Lock)是一种概念、解决某些问题的模式,并不是一种特定的机制,悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度(悲观),因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

所以简单来说悲观锁就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

例如之前我们做的火车票务系统的小案例,就是使用的悲观锁的方式,在我们的代码里都是借助于数据库自带的锁机制完成的,当用户A在购票时用户B就不能够购票,或者购票失败,这就是在整个数据处理过程中,将数据处于锁定状态,具有很明显的排他性(悲观)。 代码:

image

image

悲观锁的优点与不足:

悲观并发控制实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会;另外,在只读型事务处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载;还有会降低了并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那数据。

乐观锁:

乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。 相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。

数据版本,为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的版本标识进行比对,如果数据库表当前版本号与第一次取出来的版本标识值相等,则予以更新,否则认为是过期数据。

所以实际上乐观锁和悲观锁一样也是一种概念、解决某些业务需求的模式,并不是一种特定的机制,乐观锁的主要实现方式是我们开发人员自己通过在数据库中增加一条存储数据版本的列,然后通过代码来判断这些数据的版本,而不是借助数据库自带的锁来完成的一种锁定数据的模式。

例如我们假设一种情况:用户A和用户B同时在ATM机里往一个账户余额2000元的账户取款,两个用户都查询到账户还有2000元,所以用户A要取款1500,用户B要取款1000,然后这两个取款事务会同时提交,如果这个银行的系统逻辑写得不够好的话,就会出现2000-1500-1000=-500的结果,账户余额就会出现负数。
示意图:

image

在这种取款的情况下,如果使用悲观锁来锁住数据的话,由于其排他性,那么另外一个用户就无法查询账户余额,只能处于等待状态,因为在悲观锁里在事务结束之前数据都是处于锁定状态,而且在银行在这种数据量大的地方,使用共享锁这种行级锁也耗费资源。所以就需要用到乐观锁了,乐观锁只有在操作提交的时候才会去锁定数据。在乐观锁中我们可以给数据设定一个版本号,一旦这个数据发生修改,版本号就会发生变化,每一个操作都会先判断版本号是否是最新的版本号,不是的话就不允许操作,在乐观锁的实现过程中我们并不会使用到数据库自带的锁,所以用户们都可以任意的查询或提交操作。
示意图:

image

下面我们做一个简单的取款系统来演示如何实现乐观锁:
先准备一个表格里面填充一行数据:

image

代码示例:

image

运行结果:

image

乐观锁的优点与不足:

乐观并发控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。但如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题。

脏读简介:

脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个【学Java,到凯哥学堂kaige123.com】数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据(Dirty Data),依据脏数据所做的操作可能是不正确的。

不可重复读:

在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

幻读:

幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。

0
0
分享到:
评论

相关推荐

    windows版mysql安装包-mysql5-mysql-5.5.zip

    2. **安装步骤** - **下载**: 首先,你需要从官方网站或可信的源下载适用于Windows的MySQL 5.5安装包,即“mysql5-mysql-5.5.zip”。 - **解压**: 解压缩下载的文件,得到安装文件。 - **运行安装向导**: 双击...

    A001-MySQL安装、MySQL优化、innodb 锁问题监控处理、MySQL binlog日志、MySQL 基础

    A003-innodb 锁问题监控处理 A004-MySQL binlog日志 A005-MySQL 基础 A006-SQL语法 A007-MySQL 修改密码 特点和功能: 开源性: MySQL是开源软件,可以免费获取和使用。它的开放性质使得它受到了广泛的...

    mysql-server-mysql-8.3.0.tar.gz

    2. **InnoDB存储引擎优化**:InnoDB是MySQL默认的事务处理引擎,8.3.0版本可能会进一步优化其性能,包括更快的索引构建、更高效的锁机制以及更好的内存管理。 3. **窗口函数**:这是MySQL 8.0引入的新特性,允许在...

    mysql-server-mysql-5.7.36.tar.gz

    4. **增强的性能监控**:通过Performance Schema,用户可以更深入地了解数据库的运行情况,包括锁、线程、内存使用等,从而进行更有效的性能调优。 5. **柱状图索引(CTE)**:引入了Common Table Expressions(CTE...

    分布式锁实现(基于redis-mysql)1

    本文主要探讨了三种常见的分布式锁实现方式,包括基于Redis、MySQL以及Zookeeper的实现方法。 **基于Redis实现分布式锁** Redis是一个内存数据库,其命令执行是单线程的,这使得它非常适合用来实现分布式锁。Redis...

    行业-59 对MySQL锁机制再深入一步,共享锁和独占锁到底是什么?l.rar

    MySQL数据库在多用户环境下为了保证数据的一致性和完整性,引入了锁机制。锁是数据库管理系统中用于控制并发操作的一种机制,它确保了多个事务在读写数据时不会产生冲突。本篇文章将深入探讨MySQL中的两种主要锁类型...

    Linux-Mysql主从同步配置

    2. 不要退出 MySQL 命令行,因为退出命令行后,全局表锁就失效。 四、导出数据库 1. 导出数据库:`#mysqldump -u root -p123456 --all-databases > /root/all.sql` 2. 如果出现错误,可以使用以下命令解决:`GRANT...

    MySQL的锁机制解析

    2. **行级锁**: - **共享锁(Shared Locks)**:允许读取一行数据,但不允许修改,与其他共享锁并存。 - **排他锁(Exclusive Locks)**:允许读取和修改一行数据,阻止其他事务获取任何类型的锁。 - **Next-Key...

    实战集训营-带你锤碎MySQL.zip

    02-4-2行读锁和行写锁.mp4 02-4-3GAP锁.mp4 02-4-4死锁.mp4 03 01mycat介绍及安装.mp4 02mycat分片配置.mp4 03mycat常用分片规则.mp4 04mycat读写分离.mp4 05-1分库分表介绍.mp4 05-2数据分片方案.mp4

    shiro-freemarker-springBoot- redis-mysql

    此外,Redis还可以用于实现分布式锁,提高多线程环境下的并发处理能力。 **MySQL** MySQL是一个广泛使用的开源关系型数据库管理系统。在本项目中,MySQL主要负责持久化存储数据,如用户账户信息、权限角色等。...

    VIP-深入理解Mysql锁与事务隔离级别1

    【MySQL锁与事务隔离级别详解】 在数据库管理系统中,锁是一种关键的同步机制,用于管理多个用户或进程并发访问共享资源时的并发控制。本文将深入探讨MySQL中的锁以及事务隔离级别。 首先,我们理解一下**锁的定义...

    项目9--MySQL数据库中的事务机制与锁机制.pptx

    项目9--MySQL数据库中的事务机制与锁机制.pptx

    MYSQL 解锁与锁表介绍

    MySQL锁概述   相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁...

    MySQL锁类型以及子查询锁表问题、解锁1

    MySQL中的锁机制是数据库并发控制的关键部分,它确保了在多用户环境中数据的一致性和完整性。在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持...

    mysql读写锁演示案例

    ### MySQL读写锁知识点详解 #### 一、读写锁概念与特征 在数据库系统中,锁机制是一种非常重要的并发控制手段,它主要用于确保多用户同时访问数据时的一致性和完整性。MySQL作为一款广泛使用的开源关系型数据库...

    mysql高性能---mysql数据库的性能调优

    5. **并发控制**:通过调整线程池大小、事务隔离级别等参数,可以平衡并发处理能力和资源消耗,避免过多的锁等待和死锁。 6. **分区与分表**:对于大数据量的表,可以采用分区或分表策略,将数据分散到多个物理存储...

    2020-review-8-mysql.pptx

    在MySQL中,锁机制用来保证并发操作的一致性和隔离性,主要有以下几种类型的锁: - **共享锁**(S Lock):多个事务可以共享同一数据项的共享锁,但不允许其他事务对该数据项进行写操作。 - **排他锁**(X Lock)...

    cacti-mysql-template指标解释

    2. **脚本执行**:模板依赖于一个PHP脚本,该脚本负责从MySQL服务器收集信息并将其返回给Cacti。因此,确保服务器上安装了PHP环境,并且Cacti可以正确调用该脚本是非常重要的。 3. **统一账户**:为了简化安装和...

    go-mysql-lock:MySQL支持的锁定基元

    去mysql锁 go-mysql-lock提供基于MySQL的锁定原语锁定名称是字符串,MySQL对64个字符的锁定名称强制使用最大长度。 用例 尽管Zookeeper和etcd等系统提供了成熟的锁定原语,但是当您拥有一个主要依赖MySQL的正常运行...

Global site tag (gtag.js) - Google Analytics