MySQL事务、隔离级别

一、事务简介

事务是操作的集合,它是一个不可分割的工作单元。事务将向整个系统提交或取消操作请求,即这些操作要么同时成功,要么同时失败。

[En]

A transaction is a collection of operations, which is an indivisible unit of work. Transactions will submit or cancel operation requests to the system as a whole, that is, these operations either succeed or fail at the same time.

二、有关事务操作

MySQL中的事务是默认的自动提交的,我们可以手动的去关闭 或者开启事务

#查看事务是否自动提交  
select @@autocommit;        # 等于1 默认自动提交

#设置事务提交方式
set @@autocommit = 0;       # 关闭自动提交事务

#也可以直接设置开启事务
start transaction ;
#或着
begin ;

#提交事务  如果业务操作正常完成就提交事务
commit ;

#回滚事务   如果业务操作在执行过程中出现异常 回滚事务保证事务的完整性和正确性
rollback ;

三、事务的四大特性(ACID)

原子性(Atomicity) : 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。

一致性 (Consistency) : 事务完成时,必须使所有的数据都保持一致状态。

隔离性(Isolation) : 数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

持久性(Durability) : 事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

四、并发事务问题

1、脏读

一个事务读取另一个事务尚未提交的事务。

[En]

One transaction reads a transaction that has not been committed by another transaction.

2、不可重复读

一个事务一个接一个地读取相同的记录,但两次读取的数据不同。

[En]

A transaction reads the same record one after another, but the data read two times is different.

3、幻读

当一笔交易按条件查询数据时,它并没有这些数据,但在插入数据时,却发现该数据已经存在,这似乎是一种“幻觉”。

[En]

When a transaction queries the data according to the conditions, it does not have this data, but when inserting the data, it is found that the data already exists, which seems to be an “illusion”.

五、事务的隔离级别

1、读未提交(Read uncommitted)

它可能发生:脏读、不可重复读、幻读;最差隔离级别和最高性能。

[En]

It may occur: dirty reading, unrepeatable reading, phantom reading; the worst isolation level and the highest performance.

2、读已提交(Read committed)

可能出现:不可重复阅读、幻影阅读。

[En]

May appear: non-repeatable reading, phantom reading.

3、可重复读(Repeatable Read(mysql的默认隔离级别))

可能出现:幻读。

4、串行化(Serializable)

以上所有并发问题都可以解决,隔离级别最高,但性能最差。

[En]

All of the above concurrency problems can be solved, with the highest isolation level but the worst performance.

#查看事务隔离级别
select @@transaction_isolation;     # REPEATABLE-READ

#设置事务的隔离级别
set session transaction isolation level read uncommitted ;

set session transaction isolation level read committed ;

set session transaction isolation level repeatable read ;

set session transaction isolation level serializable ;

场景一

在idea中开启两个控制台,设置事务级别为 读未提交隔离级别 并开启事务

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 再次查询

MySQL事务、隔离级别

可见在控制台2执行更新操作后,还没提交,控制台1再次执行查询操作时,查询到的数据已经改变了,证实了 读未提交发生脏读现象

场景二

在idea中开启两个控制台,设置事务级别为 读已提交隔离级别 并开启事务

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 再次查询

MySQL事务、隔离级别

确认事务的隔离级别设置为已提交读以解决脏读问题

[En]

It is confirmed that the isolation level of the transaction is set to * read has been committed to solve the dirty read problem *

场景三

在idea中开启两个控制台,设置事务级别为 读已提交 并开启事务

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行commit提交后 控制台1 再次查询结果不同

MySQL事务、隔离级别

可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了 读已提交发生了不可重复读问题

场景四

在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务

控制台2 执行如下语句 未提交

MySQL事务、隔离级别

控制台1 第一次查询

MySQL事务、隔离级别

控制台2 执行commit提交后 控制台1 再次查询结果相同

MySQL事务、隔离级别

可见在控制台1在一次事务中,在控制台2更新前后查询到的数据不同,证实了 可重复读隔离级别解决了不可重复读问题

场景五

在idea中开启两个控制台,设置事务级别为 可重复读隔离级别 并开启事务

控制台1 第一次查询 为空

MySQL事务、隔离级别

MySQL事务、隔离级别

控制台2 执行插入 并提交

MySQL事务、隔离级别

控制台1 执行相同的插入sql 发现已经存在 于是就查询,但是又查不到数据

对于控制台1来说就像是”幻觉”一样,证实了 可重复读隔离级别发生了幻读问题

场景六

在idea中开启两个控制台,设置事务级别为 串行化隔离级别 并开启事务

控制台1 执行查询 为空

MySQL事务、隔离级别

MySQL事务、隔离级别

控制台2 执行插入 可见操作阻塞

MySQL事务、隔离级别

控制台1提交事务后,控制台2才能够完成插入操作

这种阻塞效应有效地避免了虚读问题,证实了串行化隔离级别解决了虚读问题

[En]

This blocking effect effectively avoids the phantom reading problem and confirms that * serialization isolation level solves the phantom reading problem *

总结:实际使用还得根据业务本身去设置隔离级别,隔离级别越高、数据越安全高但性能也越差,隔离级别越低、数据越不安全但性能越好,在设置事务隔离级别时要权衡数据安全和性能。一般情况我们都会采用数据库的默认隔离级别(Repeatable Read)

Original: https://www.cnblogs.com/yclblogs/p/15978787.html
Author: 阿龙同学
Title: MySQL事务、隔离级别

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

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

(0)

大家都在看

  • 无根用户管理podman

    在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置 基础设置 cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资…

    数据库 2023年6月14日
    085
  • Nginx平滑升级版本

    Nginx平滑升级版本 一, 查看现目前版本,准备预升级版本的安装包 #查看nginx版本 /usr/local/nginx/sbin/nginx -v #测试nginx访问是否正…

    数据库 2023年6月11日
    087
  • MySQL的B+树索引和hash索引的区别

    简述一下索引: 索引是数据库表中一列或多列的值进行排序的一种数据结构;索引分为聚集索引和非聚集索引,聚集索引查询类似书的目录,快速定位查找的数据,非聚集索引查询一般需要再次回表查询…

    数据库 2023年5月24日
    093
  • 源码 | 为金融场景而生的数据类型:Numeric

    高日耀 资深数据库内核研发毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),…

    数据库 2023年5月24日
    0102
  • zabbix监控用户,模组管理

    zabbix用户模组管理 用户管理 用户组 用户角色 用户 模板管理 模板组 模板 模板的监控项的参数也可以copy来 加入触发器 导出模板查看格式 posted @2022-09…

    数据库 2023年6月14日
    056
  • 送分题,ArrayList 的扩容机制了解吗?

    1. ArrayList 了解过吗?它是啥?有啥用? 众所周知,Java 集合框架拥有两大接口 Collection 和 Map,其中, Collection 麾下三生子 List…

    数据库 2023年6月6日
    083
  • 解决在laravel中执行migrate数据库迁移时抛出的Syntax error or access violation: 1071 Specified key was too long; max key length is 1000 bytes相关的错误问题

    先说解决方法: 在laravel的app/Providers/AppServiceProvider.php中boot方法内,加入长度限制: 至于为什么是248,那是因为在larav…

    数据库 2023年6月14日
    0100
  • 5、基于EasyExcel的导入导出

    一、Apach POI处理Excel的方式: 传统Excel操作或者解析都是利用Apach POI进行操作,POI中处理Excel有以下几种方式: 1、HSSFWorkbook: …

    数据库 2023年6月6日
    0120
  • centos7安装python

    以下操作均在root用户下进行(防止权限不够的问题)一、查看centos自带的python(python -v)因为centos自带的是python2.7的版本 二、安装自己想装的…

    数据库 2023年5月24日
    0113
  • atomic 原子自增工程案例

    案例 1 : 简单用法 atomic_int id; atomic_fetch_add(&id, 1) atomic_uint id; atomic_fetch_add(&…

    数据库 2023年6月9日
    092
  • Python–Event

    事件Event: 同进程的一样,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变…

    数据库 2023年6月9日
    076
  • Redis学习(1)—Redis概述

    什么是NoSQL NoSQL:Not Only SQL,意思不仅仅是SQL,它是属于 非关系型数据库。那什么是关系型数据库?数据结构是一种有行有列的数据库。 NoSQL数据库是为了…

    数据库 2023年6月14日
    082
  • Shell文件属性的判断与比较

    Shell支持对文件属性的判断,常用的文件属性操作符很多,如下表所示。更多文件属性操作符可以参考命令帮助手册man test [root@centos7~]#…

    数据库 2023年6月14日
    096
  • proxySQL with SemiSync

    配置读写分离 先查看一下规则表的表结构 https://github.com/sysown/proxysql/wiki/Main-(runtime)#mysql_query_rul…

    数据库 2023年6月16日
    084
  • 如何利用bat文件伪装成木马病毒整蛊他人

    bat文件是dos下的批处理文件。批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。 将以下代码复制到文本文档中,保存后修改文件后缀名称…

    数据库 2023年6月11日
    0105
  • MySQL 安全管理

    权限表 MySQL 服务器通过权限表来控制用户对数据库的访问,由 mysql_install_db 脚本初始化,MySQL 会根据这些权限表的内容为每个用户赋予相应的权限 user…

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