MySQL事务与锁

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MySQL事务与锁在关系型数据库内,事务是由一个SQL或一组SQL语句组成的逻辑处理单元。也就是说事务就相当于一个盛放SQL的容器,事务中的SQL要么全部执行成功,要么所有已经修改的操作都回滚到原来的操作,即一条SQL也不能执行成功。事务的四大特性(ACID):原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行,当在执行过程中出现错误,就会回滚到事务开始前的状态。一致性:事务的执行结果必须是从一个一致性状态向另一个一致性状态的变更。比如,A和B两人共有100元,那么不管A转钱给B,或者B转钱给A,A+B的金额永远是100。

MySQL事务与锁

1-4.jpg

一、事务与事务特性

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

事务的四大特性(ACID):

  1. 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行,当在执行过程中出现错误,就会回滚到事务开始前的状态。
  2. 一致性:事务的执行结果必须是从一个一致性状态向另一个一致性状态的变更。比如,A和B两人共有100元,那么不管A转钱给B,或者B转钱给A,A+B的金额永远是100。
  3. 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  4. 持久性:一个事务一旦提交,他对数据库的修改应该永久保存在数据库中,任何事务或故障都不应导致数据丢失。

二、MySQL事务的3种运行模式

隐式==自动

显式==手动

  1. 自动提交事务(隐式开启、隐式提交)MySQL默认的事务运行模式,在每条SQL执行完毕之后自动commit提交。
  2. 隐式事务(隐式开启、显式提交)由于在MySQL中是默认每条SQL都开启了事务的,并且每条SQL执行完毕之后都会自动提交,这样的话就只需要将自动提交关闭就可以了。
# 零时关闭    (关闭当前数据库连接在从新连接就恢复了)
set autocommit = 0;
# 永久关闭    (修改配置文件my.cnf)
autocommit = 0
  1. 显示事务(显示开启、显示提交)这就是我们手动开启事务,将SQL语句放在我们手动开启的事务中。
start transaction;
SQL语句;
commit;   # 提交、或rollback回滚
  1. 当使用了commit或者rollback后事务就结束了,在此进入需要从新开始。

三、数据库读现象

在高并发场景下,并发的多个事务去操作同一份数据,而产生的一些奇怪的现象,是数据不安全的一种体现。

  1. 脏读一个事务在对一条数据进行了修改,在这个事务还没有提交时,另一个事务也读取了这条数据,如果没有控制,那么第二个事务读到的就是一条脏数据,如果第二个事务还需要对这条数据进行操作,那么这两个事务之间就存在依赖关系,这就叫脏读。总结一句话就是事务A读取到了事务B已经修改了但未提交的数据。
  2. 不可重复读同一个事务在读取某个数据后,隔一段时间再次读取该条数据,在这中间该数据被另一个事务给修改,导致两次读取的数据不一致。
  3. 幻读幻读就是不可重复读的一种现象,同一个事务使用相同的查询条件读取以前检索的数据,却查询到了其他事务插入的符合条件的数据,这种现象叫做幻读。也就是说事务A读取到了事务B提交的新增数据。

四、锁机制

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

以互斥锁为例,让多个并发的任务同一时间只能有一个可以运行,牺牲了效率换来了数据安全。

锁的优缺点:

  • 优点:保障并发场景下数据的安全。
  • 缺点:降低了效率。

所以在使用锁的时候应该尽可能的缩小锁的范围,也就是锁住的数据越小越好,并发能力越高。

锁的分类:

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

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

按照使用方式分类:乐观锁(我在改数据的时候没有人在跟我修改同一份数据,也可以说其实它本身并不是一种锁,因为它是程序角度的一种写程序的套路,本质来说并没有加任何锁)、悲观锁(在我的事务里面,我在改数据的时候我总认为一定有人在跟我抢,悲观锁通常使用数据自带锁机制实现的)

行级锁:

行级锁它分为共享锁,排他锁,是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;  -->释放当前会话持有的任何锁

页级锁:

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

转载地址https://www.cnblogs.com/XiaoYang-sir/p/15866057.html

 

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 锁
MySQL里常见的几种锁
52 3
|
26天前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
97 43
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1630 14
|
27天前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
49 1
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
499 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
1月前
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
108 2
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
41 1
|
27天前
|
存储 关系型数据库 MySQL
MySQL锁,锁的到底是什么?
【10月更文挑战第16天】MySQL 锁锁定的是与数据和资源相关的对象,其目的是为了保证数据的一致性、避免冲突,并在并发环境下合理协调事务或操作的执行。理解锁的对象和意义对于优化数据库性能、处理并发问题至关重要。
54 0
|
2月前
|
监控 关系型数据库 MySQL
MySQL锁机制与解决死锁问题
MySQL锁机制与解决死锁问题
270 5