MySQL事务与锁

在关系型数据库内,事务是由一个SQL或一组SQL语句组成的逻辑处理单元。也就是说事务就相当于一个盛放SQL的容器,事务中的SQL要么全部执行成功,要么所有已经修改的操作都回滚到原来的操作,即一条SQL也不能执行成功。

事务的四大特性(ACID):

隐式==自动

显式==手动

在高并发场景中,多个并发事务操作相同的数据,一些奇怪的现象是数据不安全的表现。

[En]

In a high concurrency scenario, multiple concurrent transactions operate the same data, and some strange phenomena are a manifestation of data insecurity.

锁是一种确保数据安全的机制,即协调多个进程或线程并发访问一个资源。

[En]

Lock is a mechanism to ensure data security, that is, to coordinate multiple processes or threads to access a resource concurrently.

以互斥为例,一次只能运行多个并发任务中的一个,以牺牲效率来保证数据安全。

[En]

Take mutex as an example, so that only one of multiple concurrent tasks can be run at a time, sacrificing efficiency for data security.

锁的优缺点:

  • 优势:确保并发场景下的数据安全。
    [En]

    advantage: ensuring the security of data in concurrent scenarios.*

  • 缺点:降低了效率。

因此,在使用锁时,应尽可能缩小锁的范围,即锁定的数据越小越好,并发能力越高。

[En]

Therefore, when using the lock, we should narrow the scope of the lock as much as possible, that is, the smaller the locked data, the better, the higher the concurrency ability.

锁的分类:

按粒度分类:行级锁、表级锁、页级锁。

[En]

Classified by granularity: row-level lock, table-level lock, page-level lock.

按级别分类:共享锁、排他锁。

[En]

Classified by level: shared lock, exclusive lock.

按使用方式分类:乐观锁(当我更改数据时,没有人在修改和我相同的数据,也可以说它本身不是锁,因为它是从程序的角度编写程序的例程。本质上,没有锁),悲观锁(在我的事务中,当我更改数据时,我总是认为肯定有人在抢我悲观锁通常是使用数据内置的锁定机制实现的)

[En]

Classified by way of use: optimistic lock (no one is modifying the same data as me when I change the data, it can also be said that it is not a lock itself, because it is a routine of writing a program from a program point of view. Essentially, there is no lock), pessimistic lock (in my affairs, when I change the data, I always think that someone must be robbing me Pessimistic locks are usually implemented using the data-built-in locking mechanism)

行级锁:

行级锁它分为共享锁,排他锁,是MySQL中粒度最细的一种锁,所以它的并发能力也是最高的。

对于insert、update、delete语句、innodb会自动给涉及的数据加锁,而且是排他锁;

对于普通的select语句,innodb不会加任何锁,需要手动自己加,可以加两种类型的锁;

--共享锁(s):能同时加到锁和抢到锁的是多个,保障读的一致性
select * from 表名 where ... lock in share mode;
--排他锁(x):同一时间只能有一个能抢到,保障写数据的安全
select * from 表名 where ... for update;

锁的使用:例如

1、事务A对id=3的行加了互斥锁后,其他事务对id=3的行不能加任何锁(写不行,但是可以读)

2、事务A对id=3的行加了共享锁后,其他事务对id=3的行只能加共享锁,或者不加锁(写不行,但可以读)

表级锁:

表级锁是MySQL中粒度最大的一种锁,整张表都被加锁,当然并发能力也是最低的。

lock table 表名 read(write),表名 read(write),.........;

--SQL语句

unlock tables;  -->释放当前会话持有的任何锁

页级锁:

页锁是介于表锁和行锁之间的一种锁,粒度介于表锁和行锁之间,并发能力一般。

[En]

Page lock is a kind of lock between table lock and row lock, the granularity is between table lock and row lock, and the concurrency ability is general.

Original: https://www.cnblogs.com/XiaoYang-sir/p/15866057.html
Author: Mr-Yang`
Title: MySQL事务与锁

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507836/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一条SQL查询语句是如何执行的?

    MySQL是典型的 C/S架构(客户端/服务器架构),客户端进程向服务端进程发送一段文本(MySQL指令),服务器进程进行语句处理然后返…

    数据库 2023年5月24日
    0103
  • Mysql_视图

    视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由…

    数据库 2023年6月11日
    0112
  • Dubbo源码(一)-SPI使用

    Dubbo 的可扩展性是基于 SPI 去实现的,而且Dubbo所有的组件都是通过 SPI 机制加载。 SPI 全称为 (Service Provider Interface) ,是…

    数据库 2023年6月11日
    0125
  • 10、比较Bigdecimal类型是否相等的方法

    一、Bigdecimal.equals()详解: Bigdecimal的equals方法不仅仅比较值的大小是否相等,首先比较的是scale(scale是bigdecimal的保留小…

    数据库 2023年6月6日
    0128
  • Zabbix-(1)安装

    环境: VMware Workstation Pro 16.0 版本 系统 Centos7 …

    数据库 2023年6月14日
    0107
  • 23种设计模式之状态模式(State)

    文章目录 概述 状态模式的优缺点 状态模式的使用场景 状态模式的结构和实现 * 模式结构 模式实现 总结 概述 当对象的状态改变时,同时改变其行为。 就拿QQ来说,有几种状态,在线…

    数据库 2023年6月6日
    0130
  • Linux 学习笔记2(未完待续)

    Linux 学习笔记2 学习Linux的原因 Linux刚面世时并没有图形界面,所有操作全靠命令完成,如磁盘操作、文件读写、目录操作、进程管理、文件权限; 在职场中,大量的服务器维…

    数据库 2023年6月14日
    0109
  • dubbo 使用Multicast注册中心找不到Provider (No provider available for the service)

    使用Multicast注册中心配置,缺省配置为通过Multicast注册中心广播互相发现。所以在同一台机器时需设置unicast=false:即:multicast://224.5…

    数据库 2023年6月16日
    0138
  • 域名SSL认

    阿里云:域名SSL认证-视频 Hole yor life get everything if you never give up. Original: https://www.cn…

    数据库 2023年6月9日
    0151
  • mysql主从搭建

    mysql主从搭建 环境:ubuntu20.04.1,mysql:8.0.22。主:192.168.87.3备:192.168.87.6 安装数据库 sudo apt-get in…

    数据库 2023年6月11日
    096
  • c++ map查找键值

    map用法 查找键是否存在 1、count函数 count函数用于统计key值在map中出现的次数,map的key不允许重复,因此如果key存在返回1,不存在返回0 if (mp….

    数据库 2023年6月6日
    0289
  • show engine innodb status 输出结果解读

    show engine innodb status 输出结果解读 基于MySQL 5.7.32最近想整理一下show engine innodb status的解读,但是发现中文互…

    数据库 2023年6月16日
    0128
  • 515. 在每个树行中找最大值

    515. 在每个树行中找最大值 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 示例1: 输入: root = [1,3,2,5,3,null,9]输出: […

    数据库 2023年6月16日
    0117
  • 尤娜,我去面试了

    前情回顾 从前,有一个简单的通道系统叫尤娜…… 尤娜系统的第一次飞行中换引擎的架构垂直拆分改造 四种常用的微服务架构拆分方式 面试前几天 尤娜系统经过一次拆…

    数据库 2023年6月6日
    0110
  • Golang环境安装

    一、下载地址 Golang: Downloads – The Go Programming Language GoLand编辑器: Download GoLand: A…

    数据库 2023年6月14日
    0107
  • Linux的一些的常用命令

    小杰笔记: 记录一下Linux的一些常见命令: 1:Linux关机与重启的命令: 2:切换目录与查看目录的文件: 3:文件目录的创建与删除: 4:文件的复制 删除与移动: 5:如何…

    数据库 2023年6月6日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球