MySQL 事务 异常 事务隔离的级别 – G

MySQL 事务 异常 事务隔离的级别 – GMySQL 事务 异常 事务隔离的级别 事务 在你操作数据库的同时,有可能其他用户还会不断地对数据进行增删改查操作。为了避免并行进行时出现混乱,就产生了“事务”。事务就是要保证一组数据库操作,要么全部

MySQL 事务 异常 事务隔离的级别 - G

MySQL 事务 异常 事务隔离的级别

 

事务

在你操作数据库的同时,有可能其他用户还会不断地对数据进行增删改查操作。为了避免并行进行时出现混乱,就产生了“事务”。事务就是要保证一组数据库操作,要么全部成功要么全部失败,以此来保证不混乱。

事务支持是在引擎层实现的,MySQL支持多系统,不是所有引擎都支持事务。

MySQL 事务 异常 事务隔离的级别 - G

 

事务的特性(ACID)

  • Atomicity(原子性):原子即不可分割,即事务是进行数据处理的基本单位
  • Consistency(一致性):事务使数据库从一种状态到另一种状态,且数据库的约束性不被破坏
  • Isolation(隔离性):指事务之间保持独立性,不被其他事务影响的特性。分为四个隔离等级
  • Durability(持久性):事务提交后对数据库的修改时“持久的”,持久性是用过日志来实现的(回滚日志+重做日志)。即使发生故障,数据修改依然有效,因为当事务完成,日志就会被更新,我们依然可以恢复到最后一次成功提交事务时的状态。

原子性是基础,一致性是约束,隔离性是手段,持久性是目的。

 

事务操作方式

Mysql默认autocommit = 1compelation = 0

autocommit = 1:每条SQL都自动提交

autocommit = 0:不论是否使用START TRANSACTONBEGIN,总要使用commit才能提交。有些客户端框架会默认连接后先执行set autocommit = 0的命令。这就容易造成长连接,从而造成长事务。

尽量不要长事务,详见”可重复读的实现”

compelation = 0:执行commit仅提交事务

compelation = 1:commit时相当于commit and chain,开启链式事务,提交事务后开启一个相同的事务

compelation = 2: commit时相当于commit and release,提交后会自动断开服务器连接

在MySQL默认的设置下

  • 使用START TRANSACTIONBEGIN显式开启一个事务,然后再用COMMIT提交

  • 使用ROLLBACK进行回滚,或者回滚到ROLLBACK TO [SAVEPOINT]。例如,在一个事务中为有唯一约束(包含主键)的字段插入了 多条有相同值的该字段记录。 那么,在mysql默认情况下就会产生错误,再执行ROLLBACK后就会只有未插入前的数据。如下列代码,执行后前后查询结果一致。

    SELECT * FROM t;
    ...
    BEGIN;
    INSERT INTO t id VALUES 1;
    INSERT INTO t id VALUES 1;
    ROLLBACK;
    SELECT * FROM t;
    

    代码100分

    需要注意的是,插入错误后只有手动ROLLBACK后才会执行后前后查询结果一致,不执行ROLLBACK的结果是后面的查询结果会比前面多一条id为1的记录。

 

三种异常

  • 脏读:事务并行进行时,事务A读到了事务B中新增但未提交的内容
  • 不可重复读:事务并行进行,事务A对表进行查询时事务B对表某行进行修改,导致事务A发现两次读取时的结果不同。
  • 幻读:事务并行进行,事务A进行查询时事务B对表新增数据,导致事务A两次读取时读到更多的数据。

 

用于解决异常的四个事务隔离级别

隔离得越严实,效率就会越低,我们需要在生产中寻找一个平衡点,按业务决定。

对于隔离级别从低到高分别是

  • 读未提交(READ UNCOMMIT) — 允许读到未提交的数据 — 不使用锁,无法避免三种异常

  • 读已提交(READ COMMIT) — 只能读到已提交的数据 — 其本身可避免脏读(也是Oracle和SQL

    Server默认的隔离级别) — 可以编写带锁的SQL语句来避免“不可重复读”和“幻读”

  • 可重复读(REPEATABLE READ) — 事务在执行期间看到的数据必须前后一致 — 避免 “脏读”和“不可重复读” (是MySQL默认的隔离级别)

  • 可串行化(SERIALIZABLE)— 将所有事务串行化,是最高隔离等级,可以避免所有异常,但是牺牲了并发性

隔离级别效用说明例题:

MySQL 事务 异常 事务隔离的级别 - G

  • 读未提交:V1=2 V2=2 V3=2
  • 读已提交:V1=1 V2=2 V3=2
  • 可重复读:V1=1 V2=1 V3=2 (事务在执行期间看到的数据必须一致)
  • 可串行化:V1=2 V2=2 V3=2 (串行化时B在执行“将1改为2”时会被锁住,直到事务A被提交

查询mysql当前的隔离等级

代码100分mysql> show variables like "transaction_isolation";
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.02 sec)

 

“可重复读”的实现

  • 隔离的实现主要有读写锁多版本并发处理(MVCC)两种方式。(因为读写锁降低了事务并发效率,为了让读写之间也不冲突,就发明了MVCC)

  • 事务隔离的实现拓展阅读见此处,有一定了解后再整理自己的版本

  • 下面简单介绍MVCC利用ReadView(快照)实现可重复读

  • MySQL中每条记录在更新的时候都会同时记录一条回滚日志

在将1依次改为2,3,4的过程中,回滚日志有如下记录
ReadView_A:将2改为1
ReadView_B:将3改为2
ReadView_C:将4改为3
而当前:
	值为4

这就让同一条记录在系统中可以有多个版本,这就是MVCC,此时如果有”将4改为5″的事务,它并不会影响回滚日志中的A、B、C。

  • 尽量不要使用长事务:长事务意味着有很多旧的ReadView(影响回滚空间,5.5之前甚至有可能回滚空间大于真实数据),这会导致占用大量的存储空间,而且长事务还会占用锁资源,有可能拖垮整个库。

  • 删除回滚日志:默认情况下,系统会自行判断,当没有事务需要用到这些回滚日志时就会被删除。在上述例子中,如果修改为4之后就commit(相当短的事务),即会造成“没有事务需要用到这些回滚日志”,上述回滚日志就会被删除。

    也就是说事务未提交前可以回滚,提交后回滚日志会被删除(5.7实验通过)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7681.html

(0)
上一篇 2023-03-16
下一篇 2023-03-16

相关推荐

  • 使用pip install keras快速安装深度学习框架

    使用pip install keras快速安装深度学习框架深度学习是一种人工智能领域中的分支,可以让计算机从数据中获取知识,训练模型进行推理以解决各种问题。Keras是一种用于快速搭建深度学习模型的Python语言库,它能够在TensorFlow、CNTK或Theano后端上运行。虽然安装深度学习框架可能比较困难,但是使用pip install keras可以轻松安装。

    2024-06-03
    59
  • Oracle 用户与权限[亲测有效]

    Oracle 用户与权限[亲测有效]1、创建用户 create user zhansan identified by 123456; 2、授予连接数据库的权限 grant connect to zhansan; 3、授予数据库表的增、…

    2023-02-27
    162
  • 强扩展、强一致、高可用…GaussDB成为游戏行业的心头爱[通俗易懂]

    强扩展、强一致、高可用…GaussDB成为游戏行业的心头爱[通俗易懂]摘要:看GaussDB for Redis强扩展、高可用、强一致、高安全,如何玩转各大游戏场景 本文分享自华为云社区《GaussDB为什么成为游戏行业的心头爱?》,作者: GaussDB 数据库 。

    2023-06-04
    140
  • Python 查询变量类型的方法

    Python 查询变量类型的方法Python是一种动态类型语言,这就意味着在声明变量时不需要显式地指定其类型。Python会在运行时自动确定变量的类型。然而,当我们需要在程序中处理不同类型的数据时,我们需要知道变量的类型。在这篇文章中,我将介绍几种查询Python变量类型的常用方法。

    2024-05-22
    62
  • 提高数据处理效率的Python最小化实现

    提高数据处理效率的Python最小化实现现如今,数据处理已成为各行各业都必备的技能和工具。然而,数据处理效率往往成为数据处理的瓶颈。Python作为一种高级编程语言,为程序员们提供了许多工具和方法来提升数据处理效率。在本文中,我们将介绍如何使用Python来最小化实现提高数据处理效率。

    2024-03-15
    75
  • Python数组循环遍历,轻松处理数据结构

    Python数组循环遍历,轻松处理数据结构Python作为一种高级编程语言,在数据处理方面展现出了强大的能力。其中,对于数组的操作是必不可少的一部分。在Python中,数组的操作相对容易,无论是对于一维、二维还是多维数组,Python提供了多种方法和技巧来完成常见的数据操作,例如循环遍历、元素访问、数据截取、数组切片等等。

    2024-03-13
    74
  • 云原生 | 混沌工程工具 ChaosBlade Operator Pod 篇[亲测有效]

    云原生 | 混沌工程工具 ChaosBlade Operator Pod 篇[亲测有效]作者:丁源 RadonDB 测试负责人 负责 RadonDB 云数据库、容器化数据库的质量性能测试,迭代验证。对包括云数据库以及容器化数据库性能和高可用方案有深入研究。 继《混沌工程工具 ChaosB

    2023-04-21
    156
  • oracle存储过程转mysql存储过程_oracle存储过程返回结果集

    oracle存储过程转mysql存储过程_oracle存储过程返回结果集达梦存储过程的语法与oracle的高度相似,但有好多细节还是有差异。我在这次项目迁移中踩过不少小坑,在这里给大家分享一下。 说明一下,我用的版本是达梦8,迁移时碰到的问题有些我已经反馈给达梦的官方群管

    2023-03-27
    148

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注