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

SQL-锁 我认真,你随

    博客分类:
  • java
 
阅读更多

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

锁:

行级锁是MySQL中粒度最小的一种锁,他能大大减少数据库操作的冲突。但是粒度越小,实现的成本也越高。MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNODB行级锁展开的。

INNODB的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种。共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改。排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录。

一、排他锁

用法: SELECT ... FOR UPDATE;

MySQL会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。

锁申请前提:当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。

操作限制:

使用排他锁线程与不使用排他锁线程对锁定记录操作限制表

image

1.使用排他锁线程可以对其锁定记录进行读取,读取的内容为当前事物的最新版本;而对于不使用排他锁的线程,同样是可以进行读取操作,这种特性是一致性非锁定读。即对于同一条记录,数据库记录多个版本,在事物内的更新操作会反映到新版本中,而旧版本会提供给其他线程进行读取操作。

2.使用排他锁线程可对其锁定记录进行写入操作;对于不使用排他锁的线程,对锁定记录的写操作是不允许的,请求会阻塞。

3.使用排他锁进程可对其锁定记录申请共享锁,但是申请共享锁之后,线程并不会释放原先的排他锁,因此该记录对外表现出排他锁的性质;其他线程是不可对已锁定记录申请共享锁,请求会阻塞。

4.使用排他锁进程可对其锁定记录申请排他锁(实际上并没有任何意义);而其他进程是不可对锁定记录申请排他锁,申请会阻塞。

二、查询共享锁

lock in share mode 用法:

SELECT ... LOCK IN SHARE MODE; MySQL会对查询结果集中每行都添加共享锁。

锁申请前提:当前没有线程对该结果集中的任何行使用排他锁,否则申请会阻塞。

操作限制:

使用共享锁线程与不使用共享锁线程对锁定记录操作限制表

image

1.使用共享锁线程可对其锁定记录进行读取,其他线程同样也可对锁定记录进行读取操作,并且这两个线程读取的数据都属于同一个版本。

2.对于写入操作,使用共享锁的线程需要分情况讨论,当只有当前线程对指定记录使用共享锁时,线程是可对该记录进行写入操作(包括更新与删除),这是由于在写入操作前,线程向该记录申请了排他锁,然后才进行写入操作;当其他线程也对该记录使用共享锁时,则不可进行写入操作,系统会有报错提示。不对锁定记录使用共享锁的线程,当然是不可进行写入操作了,写入操作会阻塞。

3.使用共享锁进程可再次对锁定记录申请共享锁,系统并不报错,但是操作本身并没有太大意义。其他线程同样也可以对锁定记录申请共享锁。

4.使用共享锁进程可对其锁定记录申请排他锁;而其他进程是不可以对锁定记录申请排他锁,申请会阻塞。

三、表级锁

image

四、死锁

死锁,就是两个事务交叉访问对方被锁定的行。

MyISAM是没有死锁问题的,因为他会一次性获得所有的锁。InnoDB发生死锁后一般能自动检测到,并使一个事务释放锁并回退,另一个事务获得锁,继续完成事务。

在应用中,可以通过如下方式来尽可能的避免死锁:

(1)如果不同的程序会并发的存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会。

(2)在程序以批量方式处理数据时,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大的降低出现死锁的可能。

0
0
分享到:
评论

相关推荐

    sql-map-2.dtd和sql-map-config-2.dtd

    本文将深入探讨与“sql-map-2.dtd”和“sql-map-config-2.dtd”相关的知识点,以及它们在Ibatis中的作用。 Ibatis是一个轻量级的ORM(对象关系映射)框架,它允许开发者将SQL语句直接写在配置文件中,通过XML映射...

    x-pack-sql-jdbc-6.5.4.jar

    x-pack-sql-jdbc-6.5.4.jar

    x-pack-sql-jdbc-6.4-7.6各个版本jdbc驱动--百度网盘下载

    x-pack-sql-jdbc-6.4.0到x-pack-sql-jdbc-7.6.0各个版本jdbc驱动下载

    x-pack-sql-jdbc-7.4.0.jar

    x-pack-sql-jdbc-7.4.0.jar

    x-pack-sql-jdbc-7.5.1.jar

    elastic serach 数据库jdbc驱动。x-pack-sql-jdbc-7.5.1.jar

    x-pack-sql-jdbc-7.8.0.jar

    数据库客户端连接elasticsea rch的驱动jdbc库 x-pack-sql-jdbc-7.8.0.jar

    flume-ng-sql-source-1.5.2.jar

    flume-ng-sql-source-1.5.2.jar从数据库中增量读取数据到hdfs中的jar包

    flume-ng-sql-source-1.5.1

    flume-ng-sql-source-1.5.1 flume连接数据库 很好用的工具

    x-pack-sql-jdbc-6.8.0.jar

    elasticSearch 6.8 客户端连接JAR包x-pack-sql-jdbc-6.8.0

    sql-formatter npm打包后文件

    1、本资源已经对源码NPM工程打包为sql-formatter.min.js 文件可直接引入使用 2、具体说明可见下载后压缩包中的 说明.text 文件 3、相关博客文章 https://blog.csdn.net/guzuoi/article/details/111151290

    mybatis-sql-dialect

    MyBatis-SQL-Dialect是MyBatis框架的一个扩展,主要目的是为了支持不同数据库系统之间的SQL方言差异。MyBatis是一个流行的Java持久层框架,它允许开发者将SQL语句直接集成到XML或Java代码中,提供了灵活的数据访问层...

    squirrel-sql-3.8.1-standard.jar

    squirrel-sql-3.8.1-standard.jar squirrel-sql-3.8.1-standard.jar

    ibatis的sql-map dtd

    在Ibatis中,`sql-map-2.dtd`和`sql-map-config-2.dtd`分别对应于`sql-map`和`sql-map-config`文件的DTD定义。 `sql-map-2.dtd`文件主要用于定义SQL映射文件的结构。在这个文件中,你可以找到如下的元素和属性定义...

    azkaban-sql-script-2.5.0.tar.gz

    这个压缩包“azkaban-sql-script-2.5.0.tar.gz”包含的是Azkaban 2.5.0版本的SQL脚本,这些脚本可能用于在数据库中设置和配置Azkaban所需的表结构和权限。以下将详细介绍Azkaban的关键概念、功能以及与SQL脚本的关系...

    AI自动生成SQL语句的开源代码 sqlcoder-main.zip

    开源的AI自动生成SQL语句源代码,这款SQLCoder-70B-Alpha在文本到SQL的转换能力上超越了包括GPT-4在内的所有通用模型,它能更准确地理解你的需求,并生成相应的SQL查询。SQLCoder2和SQLCoder-7B模型已经向公众开放,...

    SQL:SQL-92,SQL-99和SQL-2003的BNF语法

    为了进一步学习和实践这些SQL标准,你可以参考"SQL-master"这个压缩包中的文件,它可能包含了一系列关于SQL-92、SQL-99和SQL-2003的教程、示例代码或练习题,帮助你深入理解每个版本的新特性和BNF语法。通过不断实践...

    sql-map-config-2.dtd

    sql-map-config-2.dtd ibats的dtd文件

    flume-ng-sql-source-1.4.3.jar

    flume连接数据库

    SQL-Front中文版(3.3版本的,挺好用的)

    随着信息技术的快速发展,数据库管理成为软件开发和数据分析中不可或缺的一部分。众多数据库管理工具中,...如果你在寻找一款易于使用、功能全面的数据库管理工具,那么SQL-Front中文版3.3绝对是一个值得考虑的选择。

    SQL-92标准

    SQL-92,全称Database Language SQL,是1992年由ANSI(美国国家标准协会)和ISO(国际标准化组织)联合制定的一项重要的数据库查询语言标准。这一标准对SQL进行了全面的规范,使得不同数据库系统之间的语法兼容性...

Global site tag (gtag.js) - Google Analytics