首页 > 数据库 >Sql(MySQL事务四大特性、事务隔离级别)

Sql(MySQL事务四大特性、事务隔离级别)

时间:2024-11-06 10:18:38浏览次数:3  
标签:事务 隔离 幻读 Sql MySQL 级别 读取

Sql(MySQL事务四大特性、事务隔离级别)

文章目录

1. 事务的特性

MySQL事务有四大特性。

  1. 原子性(atomicity):一个事务必须是一个不可分割的最小工作单元,整个事务所有的操作,要么成功提交,要么都失败回滚。
  2. 一致性(consistency):事务总是从一个一致性状态转换为另一个一致性状态。
  3. 隔离性(isolation):一个事务所作出的修改在还没有提交之前,对其他事务来说是不可见的。
  4. 持久性(durability):如果事务进行提交后,其所做的修改必须是永久性的,不会因为系统崩溃而丢失修改。

2. 事务隔离级别

SQL标准定义了四种隔离级别,较低级别的隔离通常来说系统开销更低些。

  1. READ UNCOMMITTED(未提交读):事务的修改,即使没有提交,对其他事务来说也是可见的。这是最低级别的事务隔离,企业生产中很少使用到。
  2. READ COMMITTED(提交读):事务在未提交前,所做的修改对其他事务是不可见的。这个隔离级别也称为不可重复读,主要是因为两次重复的数据读取,可能会产生两种完全不同的结果。
  3. REPEATABLE READ(可重复读):这个事务隔离级别保证了一个事务多次读取都是同样的结果,能够解决前面两个隔离级别可能产生的不可重复读问题。另外可重复读是MySQL默认的事务隔离级别。
  4. SERIALIZABLE(可串行化):该隔离级别会强制事务串行执行,同时对读取的每一行数据都加上锁,来。通过这种方式可以解决幻读的事务问题,不过可能导致锁竞争问题和大量的SQL超时。

2.1 幻读

并发事务带来的问题主要有四种,可以用上面我们谈到的事务隔离级别来处理。

  1. 脏读:一个事务读取到另一个事务未提交的数据。

  2. 不可重复读:一个事务多次读取同一数据,另一个事务修改了该数据,导致第一个事务第二次读取数据发现和第一次读取的数据不一致

  3. 幻读:一个事务多次读取同一数据,另一个事务给这些数据插入删除了某些内容,导致第一个事务数据的数量发生改变。

  4. 丢失修改:一个事务修改了某个数据,另一个事务与其读取同一数据且原始值都相同,另一个事务修改数据后提交,导致第一个事务的修改操作丢失。

2.2 处理幻读问题

幻读可以采用我提到的SERIALIZABLE(可串行化)隔离级别来解决幻读,事务按顺序执行,也就不会有幻读问题。

MySQL也提供了其他方法来处理幻读问题。

  1. 设置间隙锁,在两个索引值之间的数据进行加锁,可以杜绝其他事务在这个范围内对数据数量的影响。

  2. next-key锁就是间隙锁和行锁的组合,通过间隙锁锁住区间值、行锁锁住行本身

2.3 死锁问题

死锁是因为多个事务互相占用对方请求的资源导致的现象,要打破这个问题需要回滚其中一个事务,这样另一个事务就能获得请求资源了,而回滚的事务只需要重新执行即可。

InnoDB引擎目前处理死锁的方法是通过持有行级排他锁的数量来判断,持有最少行级排他锁的事务会进行回滚。

2.4 隔离级别相关命令

MySQL默认隔离级别是可重复读,企业生产一般也是用的这个隔离级别。

查看隔离级别的指令:

select @@tx_isolation

设置隔离级别为可重复读的指令:

set session transaction isolation level repeatable read

标签:事务,隔离,幻读,Sql,MySQL,级别,读取
From: https://blog.csdn.net/shiyi52530403/article/details/143562143

相关文章

  • 解决mysql 的 [HY000][1356] View ‘information_schema.TABLES‘ references invalid
    同事在修改mysql用户权限时修改了关于mysql.infoschema的权限信息,导致无法访问information_schema库下的所有视图,使用数据库连接工具连接MySQL数据库时出现报错情况,使用MySQL终端登录并执行show命令同样报错。报错信息如下:ERROR1356(HY000):View'information_s......
  • 数据库----SQL
    数据库的概念数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是......
  • mysql SQLSTATE[HY000] [1045] Access denied for user
    错误解析错误代码:SQLSTATE[HY000][1045]错误信息:Accessdeniedforuser‘root’@‘localhost’(usingpassword:YES)可能的原因密码错误:尽管重置了密码,但可能在连接数据库的代码中没有更新新的密码。用户权限问题:root用户可能没有从localhost或127.0.0.1访问数据库的......
  • SQLSTATE[HY000] [1045] Access denied for user ‘root‘@‘localhost‘ (using pass
    错误解析错误代码:SQLSTATE[HY000][1045]错误信息:Accessdeniedforuser‘root’@‘localhost’(usingpassword:YES)可能的原因密码错误:提供的密码与数据库中存储的密码不匹配。用户权限问题:用户root可能没有从localhost访问数据库的权限。配置文件问题:MySQL的配置......
  • SQL注入学习
    SQL基本语言概述访问和处理数据库的语言,结构化查询语言能让我们有能力访问数据库ANSI标准计算机语言可以与数据库程序协同工作由于各种各样的数据库出现,导致很多不同版本的SQL语言为了与ANSI标准相兼容它们必须以相似的方式共同地来支持一些主要的关键词比如SEL......
  • php购物商城在线购物系统php毕业设计php课程设计毕设指导计算机源码获取php源码获取电
    风筝一,功能介绍PHP➕MySQL前台功能:登录:用户可以通过输入用户名和密码进行身份验证,登录成功后进入个人中心页面,享受个性化服务。注册:新用户可以通过填写必要信息(如用户名、密码、邮箱等)完成注册,注册成功后即可登录并开始使用平台服务。轮播图:首页展示一系列动态轮播图,......
  • MySQL 多库备份脚本
    创建MySQL备份用户: https://www.cnblogs.com/outsrkem/p/18528941#!/bin/bashDUMP="dockerexec-itsome-mysql/bin/mysqldump"IPADDR=127.0.0.1PORT=3306USER=backupuserPASSWD=backupuserDATABASE=(db1db2)ROOT_DIR=/dataLogFile=/data/mysqldunp.logDATE......
  • MySql与Redis
    MySql与Redis1.Redis和MySQL如何保持数据一致性数据同步可以有延时一、延时双删策略在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。publicvoidwrite(Stringkey,Objectdata){redis.delKey(key);//删除redis缓存db.updateData(data)......
  • 零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG
    零基础学习SpringAIJavaAI使用向量数据库postgresql检索增强生成RAG向量数据库是一种特殊类型的数据库,在人工智能应用中发挥着至关重要的作用。在向量数据库中,查询与传统的关系数据库不同。它们不是进行精确匹配,而是执行相似性搜索。当给定一个向量作为查询时,向量数......