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)

大家都在看

  • MySQL 中如何归档数据

    归档,在 MySQL 中,是一个相对高频的操作。 它通常涉及以下两个操作: [En] It usually involves the following two actions: …

    数据库 2023年5月24日
    077
  • 汇编语言Assembly Language.asm–8086(持续更新)

    汇编语言Assembly Language.asm–8086 数据转移指令MOV 数据流向图 XCHG OPD,OPS数据交换指令 功能:将源操作数和目的操作数内容互换…

    数据库 2023年6月14日
    068
  • 23种设计模式之命令模式

    文章目录 概述 命令模式的优缺点 命令模式的应用场景 命令模式的结构和实现 * 模式的结构 模式的实现 总结 ; 概述 命令模式(Command Pattern)是一种数据驱动的设…

    数据库 2023年6月6日
    0111
  • JMeter接口自动化发包与示例

    JMeter接口自动化发包与示例 近期需要完成对于接口的测试,于是了解并简单做了个测试示例,看了看这款江湖上声名远播的强大的软件-Jmeter靠不靠谱。官网:https://jme…

    数据库 2023年6月6日
    057
  • 记一次vcenter连接esxi失败问题排查(443端口不通)

    vecenter错误 esxi宿主机重启后,vcenter连接esxi提示超时,使用vmware客户端连接esxi也提示超时,开始介入排查。 故障排查 如何进入命令终端 运行alt…

    数据库 2023年6月9日
    0101
  • MySQL实战45讲 14

    14 | count(*)这么慢,我该怎么办? 在开发系统时,您可能经常需要计算表中的行数,例如交易系统中的变动记录总数。 [En] When developing a syste…

    数据库 2023年5月24日
    080
  • 普通 Docker 与 Kubernetes 对比

    Docker提供基本容器管理 API 和容器镜像文件格式Kubernetes 管理运行容器的(物理或虚拟)主机群集,如果 Docker 是 OCP 的”内核&#8221…

    数据库 2023年6月14日
    062
  • 记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

    开心一刻 我妻子痛经了,正躺在沙发上。她两岁的女儿看着她问。 [En] My wife had dysmenorrhea and was lying on the sofa. He…

    数据库 2023年5月24日
    092
  • git开发常用命令

    1.基本命令git branch 查看本地分支git branch -r 查看远程分支git checkout xxx 切换分支git pull origin master //从…

    数据库 2023年6月9日
    081
  • MySQL进阶系列:一文详解explain

    explain有何用处呢: 为了知道优化SQL语句的执行,需要查看SQL语句的具体执行过程,以加快SQL语句的执行效率。 ​ 可以使用explain+SQL语句来模拟优化器执行SQ…

    数据库 2023年5月24日
    0104
  • 牛客SQL刷题第三趴——SQL大厂面试真题

    结果保留两位小数,并按播放进度倒序排序。 解题思路: 1、播放进度结算 ①、时间差函数,timestampdiff(unit,char(begin-end)) ②、判断,if或者用…

    数据库 2023年6月16日
    062
  • Python–Event

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

    数据库 2023年6月9日
    065
  • 20 年老程序员告诉你的 20 条编码原则

    我从 1999 年就开始了编程生涯,到今年已经有 20 多年了。我先是从 Basic 开始,很快转到了 Pascal 和 C 语言,然后又学习了面向对象编程语言 Delphi 和 …

    数据库 2023年6月14日
    083
  • 达梦数据库_DM8配置实时主备

    1、环境说明 准备三台机器DM_HD1、DM_HD11、DM_SH,DM_HD1和DM_HD11用来部署主备库,DM_SH用来部署确认监视器。其中DM_HD1和DM_HD11配置两…

    数据库 2023年6月11日
    0119
  • Vue 和 Django 实现 Token 身份验证

    使用 Django 编写的 B/S 应用通常会使用 Cookie + Session 的方式来做身份验证,用户登录信息存储在后台数据库中,前端 Cookie 也会存储少量用于身份核…

    数据库 2023年6月14日
    068
  • NO.1 通讯录管理系统+源代码(C++)

    功能描述:显示简单的菜单,供用户选择操作 实现步骤:直接cout输出 功能描述:根据用户不同的操作代码选择,进入不同的功能,我们使用switch分支结构进行搭建 实现步骤:用whi…

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