事务的隔离级别

事务的隔离级别是指多个并发事务之间相互隔离的程度,主要是为了解决并发事务带来的一致性问题,它的主要作用是控制数据库中事务的可见性和可重复读。

在 SQL 标准中,定义了四种事务隔离级别,分别为:

  1. 读未提交(Read Uncommitted) 这是最低的隔离级别,事务之间没有任何隔离,一个事务可以读取到其他事务未提交的数据,可能会出现脏读、幻读等问题。

  2. 读已提交(Read Committed) 在该隔离级别下,一个事务只能读取到已提交的数据,避免了脏读的问题,但是可能会出现不可重复读和幻读的问题。

  3. 可重复读(Repeatable Read) 在该隔离级别下,一个事务在执行期间多次读取同一数据,可以保证读取到的数据是一致的,避免了不可重复读的问题,但是可能会出现幻读的问题。

  4. 串行化(Serializable) 在该隔离级别下,事务之间完全隔离,每个事务只能按照固定的顺序执行,避免了脏读、不可重复读和幻读等问题,但是对数据库的性能有很大的影响。

除了上述四种标准的隔离级别,不同的数据库还会提供其他的隔离级别,例如 MySQL 提供了 READ_COMMITTEDREPEATABLE_READ 之间的 READ_UNCOMMITTEDREAD_COMMITTED 之间的 READ_COMMITTED,以及 REPEATABLE_READSERIALIZABLE 之间的 SERIALIZABLE

需要注意的是,隔离级别越高,事务之间的隔离程度越高,但是对数据库的性能影响也越大,因此需要根据实际情况进行选择。同时,在使用事务时,还需要注意避免出现死锁、长时间等待和并发更新等问题。

在 SQL 标准中,定义了四种事务隔离级别 详细说一下每种隔离级别

好的,下面详细介绍一下 SQL 标准中定义的四种事务隔离级别:

  1. 读未提交(Read Uncommitted) 这是最低的隔离级别,一个事务可以读取到其他事务未提交的数据,可能会出现脏读、幻读等问题。在该级别下,读取数据不需要获得共享锁,也不需要对写入数据进行独占锁定,因此会出现数据不一致的问题。因为这种隔离级别的问题较多,因此在实际使用中很少使用。

  2. 读已提交(Read Committed) 在该隔离级别下,一个事务只能读取到已提交的数据,避免了脏读的问题。在该级别下,读取数据需要获得共享锁,写入数据需要获得独占锁,保证了事务之间的互斥性。但是,多个事务之间的读操作可能会出现不一致的问题,即出现不可重复读的问题。不可重复读的问题是指,在同一事务中多次读取同一数据,但是每次读取的结果可能不一样。

  3. 可重复读(Repeatable Read) 在该隔离级别下,一个事务在执行期间多次读取同一数据,可以保证读取到的数据是一致的,避免了不可重复读的问题。在该级别下,读取数据需要获得共享锁,写入数据需要获得独占锁,保证了事务之间的互斥性。但是,在该级别下,多个事务之间可能会出现幻读的问题。幻读是指,在一个事务执行期间,另一个事务插入了一条新数据,然后第一个事务再次执行相同的查询,此时会发现出现了一个新的数据,即出现了幻读的问题。

  4. 串行化(Serializable) 在该隔离级别下,事务之间完全隔离,每个事务只能按照固定的顺序执行,避免了脏读、不可重复读和幻读等问题。在该级别下,读取数据需要获得共享锁,写入数据需要获得独占锁,保证了事务之间的互斥性。但是,这种隔离级别对数据库的性能影响最大,因为每个事务必须等待前一个事务执行完毕后才能执行,因此在实际应用中使用较少。

需要注意的是,不同的数据库会提供不同的隔离级别,同时在使用事务时,还需要注意避免出现死锁、长时间等待和并发更新等问题。

使用mysql 模拟一下可重复读的问题

好的,下面给出使用 MySQL 模拟可重复读问题的示例:

-- 如何查看mysql事务隔离级别
SHOW VARIABLES LIKE 'transaction_isolation'; SET TRANSACTION ISOLATION LEVEL <隔离级别>;
-- 其中,<隔离级别> 可以为 READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。 -----------------------------------------------------------------------------------------------------------------------------
-- 使用mysql 模拟一下不可重复读的问题
-- 首先,创建一个测试表 test,包含两列,分别为 id 和 value: CREATE TABLE test (
id INT PRIMARY KEY,
value INT
); -- 然后,插入一些测试数据:
INSERT INTO test VALUES (1, 10); -- 开启两个 MySQL 客户端,分别连接到同一个数据库实例中,并分别开启事务: -- 客户端 1
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT * FROM test;
COMMIT;
-- 客户端 2
START TRANSACTION;
UPDATE test SET value = value + 1 WHERE id = 1;
COMMIT; -- 在客户端 1 中,再次执行查询语句: SELECT * FROM test; -- 此时,客户端 1 会返回不同的结果,即 value 由 10 变成了 11,这就是不可重复读问题。因为在该隔离级别下,一个事务在执行期间多次读取同一数据,可能会出现另一个事务修改了数据的情况,导致读取到的数据不一致,出现了不可重复读问题。

格式化好的sql

  1. 首先,创建一个测试表 test,包含两列,分别为 id 和 value:
sqlCopy code
CREATE TABLE test ( id INT PRIMARY KEY, value INT );
  1. 然后,插入一些测试数据:
sqlCopy code
INSERT INTO test VALUES (1, 10);
  1. 开启两个 MySQL 客户端,分别连接到同一个数据库实例中,并分别开启事务:
sqlCopy code
-- 客户端 1 START TRANSACTION; SELECT * FROM test;
-- 客户端 2 START TRANSACTION; UPDATE test SET value = value + 1 WHERE id = 1; COMMIT;
  1. 在客户端 1 中,再次执行查询语句:
sqlCopy code
SELECT * FROM test;

此时,客户端 1 会返回上一次查询的结果,即 value 仍然为 10,这就是可重复读问题。因为在该隔离级别下,一个事务在执行期间多次读取同一数据,可以保证读取到的数据是一致的,避免了不可重复读的问题。但是,在该级别下,多个事务之间可能会出现幻读的问题,即在一个事务执行期间,另一个事务插入了一条新数据,然后第一个事务再次执行相同的查询,此时会发现出现了一个新的数据,即出现了幻读的问题。

使用mysql 模拟一下不可重复读的问题

好的,下面给出使用 MySQL 模拟不可重复读问题的示例:

  1. 首先,创建一个测试表 test,包含两列,分别为 id 和 value:
sqlCopy code
CREATE TABLE test ( id INT PRIMARY KEY, value INT );
  1. 然后,插入一些测试数据:
sqlCopy code
INSERT INTO test VALUES (1, 10);
  1. 开启两个 MySQL 客户端,分别连接到同一个数据库实例中,并分别开启事务:
sqlCopy code
-- 客户端 1 START TRANSACTION; SELECT * FROM test;
-- 客户端 2 START TRANSACTION; UPDATE test SET value = value + 1 WHERE id = 1; COMMIT;
  1. 在客户端 1 中,再次执行查询语句:
sqlCopy code
SELECT * FROM test;

此时,客户端 1 会返回不同的结果,即 value 由 10 变成了 11,这就是不可重复读问题。因为在该隔离级别下,一个事务在执行期间多次读取同一数据,可能会出现另一个事务修改了数据的情况,导致读取到的数据不一致,出现了不可重复读问题。

如何查看mysql事务隔离级别

可以通过 MySQL 的 SHOW VARIABLES 命令来查看当前 MySQL 实例的事务隔离级别。具体步骤如下:

  1. 连接到 MySQL 实例,可以使用 MySQL 客户端命令行工具或其他 MySQL 数据库管理工具。

  2. 执行以下命令,查看当前事务隔离级别:

sqlCopy code
SHOW VARIABLES LIKE 'transaction_isolation';

该命令会显示当前 MySQL 实例的事务隔离级别。

MySQL 的事务隔离级别可以分为四个级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。如果该命令返回的值为 DEFAULT,则表示当前使用的是默认的事务隔离级别。

如何修改mysql事务隔离级别

 

可以通过 MySQL 的 SET TRANSACTION ISOLATION LEVEL 命令来修改当前会话的事务隔离级别。具体步骤如下:

  1. 连接到 MySQL 实例,可以使用 MySQL 客户端命令行工具或其他 MySQL 数据库管理工具。

  2. 执行以下命令,修改当前会话的事务隔离级别:

sqlCopy code
SET TRANSACTION ISOLATION LEVEL <隔离级别>;

其中,<隔离级别> 可以为 READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。

  1. 修改成功后,可以使用 SHOW VARIABLES 命令再次查看当前事务隔离级别,验证修改是否生效:
sqlCopy code
SHOW VARIABLES LIKE 'transaction_isolation';

需要注意的是,修改当前会话的事务隔离级别并不会影响其他会话的事务隔离级别,也不会影响 MySQL 实例的默认事务隔离级别。如果需要修改 MySQL 实例的默认事务隔离级别,需要修改 MySQL 配置文件中的相关参数。

如何修改mysql事务隔离级别为读已提交

可以通过以下步骤修改 MySQL 实例的默认事务隔离级别为 READ COMMITTED(读已提交):

  1. 修改 MySQL 配置文件 my.cnf,找到 [mysqld] 段落。

  2. 在该段落中添加以下参数:

    iniCopy code
    transaction-isolation = READ-COMMITTED

    如果该参数已经存在,需要修改其值为 READ-COMMITTED

  3. 保存并关闭 my.cnf 文件。

  4. 重启 MySQL 服务,使修改生效。

  5. 验证修改是否成功,可以使用 SHOW VARIABLES 命令查看当前事务隔离级别:

    sqlCopy code
    SHOW VARIABLES LIKE 'transaction_isolation';

需要注意的是,修改 MySQL 实例的默认事务隔离级别会影响所有新建的 MySQL 会话,如果需要修改已有会话的事务隔离级别,需要使用 SET TRANSACTION ISOLATION LEVEL 命令在每个会话中进行修改。

如何在每个会话中修改mysql事务隔离级别为读已提交

可以通过以下步骤在每个 MySQL 会话中修改事务隔离级别为 READ COMMITTED(读已提交):

  1. 连接到 MySQL 实例,可以使用 MySQL 客户端命令行工具或其他 MySQL 数据库管理工具。

  2. 执行以下命令,设置当前会话的事务隔离级别:

    sqlCopy code
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

    上述命令会将当前会话的事务隔离级别设置为 READ COMMITTED。

  3. 执行需要执行的 SQL 语句,MySQL 会在该会话中以读已提交的方式进行事务处理。

需要注意的是,每个 MySQL 会话都是独立的,它们之间的事务隔离级别互不干扰。因此,如果需要在多个会话中使用相同的事务隔离级别,需要在每个会话中分别进行设置。

chatGPT教你学sql的事务的更多相关文章

  1. 教你管理SQL备份与恢复系列(1-20)

    原链接:https://bbs.51cto.com/thread-1147908-1.html 教你备份与恢复数据库,直接下面下文档吧. 教你备份与恢复数据库(1)事务 http://bbs.51ct ...

  2. 手把手教你学Dapr - 5. 状态管理

    上一篇:手把手教你学Dapr - 4. 服务调用 介绍 使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中. 您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来 ...

  3. 轻松学SQL Server数据库

    轻松学SQL Server数据库pdf   下载地址:网盘下载 目录:  第1章 数据库与SQL Server 2008 11.1 数据库基础 21.1.1 数据库的概念 21.1.2 数据库模型 2 ...

  4. 教你管理SQL数据库系列(1-4)

    原文 教你管理 SQL Server 数据库(1)数据库的结构  http://bbs.51cto.com/thread-1084951-1.html教你管理 SQL Server 数据库(2)系统数 ...

  5. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  6. 教妹学Java:Spring 入门篇

    你好呀,我是沉默王二,一个和黄家驹一样身高,刘德华一样颜值的程序员(管你信不信呢).从两位偶像的年纪上,你就可以断定我的码龄至少在 10 年以上,但实话实说,我一直坚信自己只有 18 岁,因为我有一颗 ...

  7. 手把手教你学Dapr - 7. Actors

    上一篇:手把手教你学Dapr - 6. 发布订阅 介绍 Actor模式将Actor描述为最低级别的"计算单元".换句话说,您在一个独立的单元(称为actor)中编写代码,该单元接收 ...

  8. 手把手教你学Dapr - 9. 可观测性

    目录 手把手教你学Dapr - 1. .Net开发者的大时代 手把手教你学Dapr - 2. 必须知道的概念 手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 手把手教你学Dapr ...

  9. 人人都是 DBA(VI)SQL Server 事务日志

    SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...

  10. 30分钟手把手教你学webpack实战

    30分钟手把手教你学webpack实战 阅读目录 一:什么是webpack? 他有什么优点? 二:如何安装和配置 三:理解webpack加载器 四:理解less-loader加载器的使用 五:理解ba ...

随机推荐

  1. redis开启多端口

    Centos安装多端口的redis服务 背景 redis默认端口6379,由于开发需要,key有重复.于是另起端口6380. 配置服务过程 1.新建/etc/redis6380.conf,内容如下: ...

  2. 如何下载RTMP/http直播源直播视频(比尔下载器使用完整教程)

    之前已经介绍了如何抓取各种app直播源及在线视频地址,本节内容将详细介绍如何下载rtmp/http直播源的直播视频,请注意,rtmp/http指协议,不针对任何app,凡是使用了以上协议的基本原理一样 ...

  3. 最强本地缓存Caffeine

    Caffeine 是基于 JAVA 8 的高性能缓存库.并且在 spring5 (springboot 2.x) 后spring 官方放弃了 Guava,而使用了性能更优秀的 Caffeine 作为默 ...

  4. 6 定时器 &中断管理&资源管理

    生成函数 周期,多久触发一次定时器(从定时器启动开始计算)  触发什么呢? 回调函数被调用,被谁调用呢 1,tick中断去调用timer函数  Linux中使用这个  (定时器回调函数若执行时间过长, ...

  5. vue peek 解决了 vue-template 加载 相对目录 ./components 组件内容 vscode

    点击组件跳转,vue-helper 带@的能跳转,相对目录的不能跳转.vue peek 解决了这个问题.

  6. arch安装deep-wine-wechat时,跳过md5检测的方法

    yay -S --mflags --skipinteg deepin-wine-wechat 这条命令是的我们跳过了md5检测! 微信的安装位置:C:\Program Files\Tencent\We ...

  7. 手撕fft算法--fft原理和源码解析

    一 前言   在音频信号处理中,fft变换是一个无法绕过过去的存在.借着一次算法出来的机会,把fft熟悉一下不为过啊.   二 问题   这里,其实是由一个问题驱动的,那就是:怎么通过fft的变化来得 ...

  8. ETL工具-KETTLE教程 实例实战4----转换(值映射、列转行,增加常量、增加序列等)

    附:Kettle实战视频教程,需要的朋友可以看看学习下哈~~ kettle实战第一讲-文件和数据库表的互相转换处理_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili kettle实战第二讲-数据库单 ...

  9. QT 自定义QGraphicsItem 缩放后旋转 图形出现漂移问题

    实现自定义QGraphicsItem缩放和旋转时,遇到了这样一个问题:将item旋转一个角度,然后拖拽放大,再次进行旋转时图像会发生漂移.原本以为是放大后中心点位置没有改变,导致旋转时以原中心的旋转出 ...

  10. 让艺术触手可及!3DCAT实时云渲染赋能真浪数字艺术馆首展

    2023年5月18日,由真浪数字艺术和EZVR联合打造的真浪数字艺术馆首展–「破界·交织」让艺术更自由,正式与大家相见.此次展览分为五个主题展馆,汇聚了来自全球各领域的19位青年数字艺术家一同探讨虚实 ...