MySQL事务与锁

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 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

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
4月前
|
SQL AliSQL 关系型数据库
MYSQL的全局锁和表锁
本文介绍了MySQL中的锁机制,包括全局锁、表级锁及其应用场景。全局锁通过`Flush tables with read lock (FTWRL)`实现,主要用于全库逻辑备份,但会阻塞更新和结构变更操作。表级锁分为显式表锁(`lock tables`)和元数据锁(MDL),前者用于控制并发访问,后者自动加锁以确保读写正确性。文章还探讨了如何安全地为小表添加字段,建议通过设置DDL等待时间或使用MariaDB/AliSQL的NOWAIT/WAIT功能避免业务阻塞。这些方法有助于在高并发场景下优化数据库性能与安全性。
110 0
|
2月前
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
141 1
|
9月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
4190 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
7月前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
313 25
|
8月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
343 7
MySQL事务日志-Undo Log工作原理分析
|
8月前
|
存储 关系型数据库 MySQL
MySQL进阶突击系列(06)MySQL有几种锁?| 别背答案,现场演示一下
本文详细解析了MySQL InnoDB存储引擎的锁机制,涵盖读锁、写锁、意向锁、记录锁、间隙锁和临键锁等8种锁类型。重点探讨了不同锁类型的加锁与释放方式,以及事务并发场景下的实战验证。通过具体示例,展示了在不同情况下锁的行为及其对事务的影响。文章还特别强调了锁的作用范围主要是索引,并解释了锁如何影响数据的读写操作。最后总结了并发事务中加锁规则,帮助读者深入理解MySQL的锁机制。
|
11月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
258 43
|
9月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
10月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆

推荐镜像

更多