MySQL事务基本使用

1 事务概述

1.1 事务的支持情况

使用 SHOW ENGINES命令来查看当前MySQL支持的存储引擎,以及这些存储引擎是否支持事务

MySQL事务基本使用

能看出在 MySQL 中,只有InnoDB 是支持事务的。

1.2 事务的特性

ACID

  1. 原子性(A)

⼀个事务的所有操作,要么全部完成,要么都没完成,不能结束在中间环节。如果事务在执⾏过程中发⽣错误,会被回滚到事务开始之前的状态

  1. 一致性(C)

在事务开始之前以及事务结束之后,数据库的完整性不能被破坏

  1. 隔离性(I)

允许多个并发事务同时对数据进⾏修改和读写的能⼒,它可以防⽌由于多个事务并发执⾏时由于交叉执⾏⽽导致的数据不⼀致

  1. 持久性(D)

事务处理结束了以后,对数据的修改是永久的,即使是发⽣了系统故障,数据也不会丢失

1.3 事务的状态

MySQL事务基本使用

2 使用事务

使用事务有两种方式,分别为 显式事务隐式事务

2.1 显示事务

  1. START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务
mysql> BEGIN;
#或者
mysql> START TRANSACTION;

START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符 :

READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不能修改数据。

READ WRITE :标识当前事务是一个 读写事务 ,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据。

WITH CONSISTENT SNAPSHOT :启动一致性读。

  1. 一系列事务中的操作(主要是DML,不含DDL)
  2. 提交事务 或 中止事务(即回滚事务)
提交事务。当提交事务后,对数据库的修改是永久性的。
mysql> COMMIT;

回滚事务。即撤销正在进行的所有没有提交的修改
mysql> ROLLBACK;

将事务回滚到某个保存点。
mysql> ROLLBACK TO [SAVEPOINT]

2.2 隐藏事务

MySQL中有一个系统变量 autocommit :

mysql> SHOW VARIABLES LIKE 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.01 sec)
  • 当我们设置 autocommit=0 时,不论是否采用 START TRANSACTION 或者 BEGIN 的方式来开启事务,都需要用 COMMIT 进行提交,让事务生效,使用 ROLLBACK 对事务进行回滚。
  • 当我们设置 autocommit=1 时,每条 SQL 语句都会自动进行提交。 不过这时,如果你采用 START TRANSACTION 或者 BEGIN 的方式来显式地开启事务,那么这个事务只有在 COMMIT 时才会生效,在 ROLLBACK 时才会回滚。

3 事务隔离等级

3.1 数据并发问题

1. 脏写( Dirty Write

对于两个事务 Session A、Session B,如果事务Session A 修改了 另一个 未提交 事务Session B 修改过 的数据,那就意味着发生了 脏写

2. 脏读( Dirty Read

对于两个事务 Session A、Session B,Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效 的。

3. 不可重复读( Non Repeatable Read

对于两个事务Session A、Session B,Session A 读取 了一个字段,然后 Session B 更新 了该字段。 之后Session A 再次读取 同一个字段, 值就不同 了。那就意味着发生了不可重复读。

4. 幻读( Phantom

对于两个事务Session A、Session B, Session A 从一个表中 读取 了一个字段, 然后 Session B 在该表中 插 入 了一些新的行。 之后, 如果 Session A 再次读取 同一个表, 就会多出几行。那就意味着发生了幻读。

3.2 事务隔离等级介绍

上面介绍了几种并发事务执行过程中可能遇到的一些问题,这些问题有轻重缓急之分,我们给这些问题按照严重性来排一下序:

脏写 > 脏读 > 不可重复读 > 幻读

我们愿意舍弃一部分隔离性来换取一部分性能在这里就体现在:设立一些隔离级别,隔离级别越低,并发问题发生的就越多。 SQL标准 中设立了4个 隔离级别 :

果。不能避免脏读、不可重复读、幻读。

  • READ UNCOMMITTED读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。
  • READ COMMITTED读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可重复读、幻读问题仍然存在。
  • REPEATABLE READ可重复读,事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。
  • SERIALIZABLE可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避免脏读、不可重复读和幻读。

3.3 设置事务隔离等级

MySQL的默认隔离级别为 REPEATABLE READ

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;
#其中,隔离级别格式:
> READ UNCOMMITTED
> READ COMMITTED
> REPEATABLE READ
> SERIALIZABLE

4 小结

数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度, 隔离级别越高,数据一致性就越好,但并发性越弱

Original: https://www.cnblogs.com/xnmk-zhan/p/15993822.html
Author: xnmk
Title: MySQL事务基本使用

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

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

(0)

大家都在看

  • 微信小程序二维码

    一、获取小程序码的三个接口 不同的接口对应不同的业务场景,接口B用的较多,接口C官方不推荐使用,也就是说根据需码量来决定选择A接口还是B接口。 (1)、接口 A: 适用于需要的码数…

    数据库 2023年6月6日
    0118
  • 两表关联更新、删除-七星海棠

    两表关联更新 通用方法 update test1 set name=(select name from test2 where test2.id=test1.id), age=(s…

    数据库 2023年6月11日
    082
  • zabbix监控用户,模组管理

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

    数据库 2023年6月14日
    054
  • 安装Pycharm2022.2.1版本操作说明

    下载pycharm:https://www.jetbrains.com.cn/pycharm/download/#section=windows 我下载的是社区版”Co…

    数据库 2023年6月14日
    0160
  • 第七章:Hexadecimal, octal, ASCII, UTF8, Unicode, Runes

    本篇翻译自《Practical Go Lessons》 Chapter 7: Hexadecimal, octal, ASCII, UTF8, Unicode, Runes 1 你…

    数据库 2023年6月6日
    086
  • django-ckeditor上传图片到阿里云OSS

    参考信息 资料1: django_ckeditor上传图片到七牛云OSS 使用 1. 安装django-ckeditor 【参考 资料1 】 2. setting.py配置INST…

    数据库 2023年6月9日
    097
  • 在启动mysql时,执行service mysqld start报错,不能进入Mysql

    在启动mysql时,执行 service mysqld start报错,不能进入Mysql执行 systemctl restart mysqld.service 成功进入! Ori…

    数据库 2023年6月11日
    079
  • mysql数据库 Window下安装

    关系数据库,是建立在关系数据库模型基础上的数据库,借助于集合代数等概念和方法来处理数据 库中的数据,同时也是一个被组织成一组拥有正式描述性的表格,该形式的表格作用的实质是装载着数 …

    数据库 2023年6月9日
    094
  • Java Script 循环,数组,对象,判断,阶乘,查找-综合运用合集

    输出100个hello world. for (var i = 1; i console.log("hello world");} 创建一个包含1~100的数组…

    数据库 2023年6月11日
    085
  • MySQL中的全表扫描和索引树扫描

    引言 在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况。在使用explain时,我们可以观察到,explain的输出有一个很关键的列,它就…

    数据库 2023年5月24日
    0130
  • 高并发组件了解

    消息队列 A服务和多个服务耦合,内部维护对多个服务发送数据的接口,那么这些接口如果有的挂了,有的不需要了,那么还得修改A内部的代码,如果使用MQ,A发送消息就好,不必考虑那么多事情…

    数据库 2023年6月16日
    063
  • mysql笔记

    DBMS:数据库管理系统SQL:用于访问和处理数据库的标准的计算机语言DB:数据库 三者的关系: DBMS数据库管理系统执行SQL语句,来操作DB数据库当中的数据的 条件查询 in…

    数据库 2023年5月24日
    072
  • 6、SQL模糊查询LIKE concat用法

    concat用来拼接查询的字符串: SELECT * FROM page_demo WHERE name LIKE concat(‘%’,#{name},’%’) 模糊查询: 1、…

    数据库 2023年6月6日
    0131
  • [mybatis]快速搭建一个mybatis程序,实现对数据的增删改查

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyBati…

    数据库 2023年5月24日
    084
  • MySQL语句与正则表达式

    正则表达式的作用是匹配文本,将一个模式(正则表达式)与一个文本串进行比较。MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定正则表达式,过滤SELECT检索出的数据…

    数据库 2023年6月16日
    092
  • SQL 基础

    在平时的工作中,大家可能是 ORM 战士。但是 ORM 之下,还是原生的 SQL。这是整理 SQL 基础时的一些记录。 数据定义语言,用来定义数据库对象,包括数据库、数据表和列。 …

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