IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 第三章 事务隔离 -> 正文阅读

[大数据]第三章 事务隔离

第三章 事务隔离

  • 事务的特性:原子性、一致性、隔离性、持久性
  • 在 MySQL 中,事务支持是在引擎层实现的。
  • MyISAM 既不支持事务,又没有 crash-safe

隔离性与隔离级别

当数据库上有多个事务同时执行的时候,就有可能出现以下几种情况:

  • 脏读:读到其他事务未提交的数据;
  • 不可重复读:前后读取的记录内容不一致;
  • 幻读:前后读取的记录数量不一致。

为了解决这些情况,就有了“隔离级别”的概念

SQL 标准的事务隔离级别包括:

  • 读未提交(read uncommitted):别人改数据的事务尚未提交,我在我的事务中也能读到。
  • 读提交(read committed):别人改数据的事务已经提交,我在我的事务中才能读到。
  • 可重复读(repeatable read):一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的
  • 串行化(serializable ):我的事务尚未提交,别人就别想改数据。
  • 注意:MySQL的默认隔离级别是 “可重复读”

举例

mysql> create table T(c int) engine=InnoDB;
insert into T(c) values(1);
Untitled
  • 如果是“读未提交”:V1 的值就是 2,V2、V3 也都是 2
  • 如果是“读提交”:V1 是 1,V2 、V3也都是 2
  • 如果是“可重复读”:V1、V2 是 1,V3 是 2
  • 如果是“串行化”:事务A一开始查询值1的时候就获得了读锁,根据两阶段加锁,事务A获得的锁要在 commit 的时候才释放,所以事务B在修改1为2的时候申请写锁会阻塞直到事务A提交,事务A提交之前获取的值都是1,所以V1、V2都是 1,事务A提交后事务B才获取到写锁完成更新操作,所以V3是 2

关于 MVCC视图 的理解

  • 读未提交 (RU):没有视图的概念,直接返回记录上的最新值。
  • 读提交 (RC):在每一行SQL语句执行的时候创建。
  • 可重复读 (RR):在第一个Select语句执行时创建的。
  • 串行化 (Serial):通过锁来实现数据访问,没有视图的概念。

查看和设置当前数据库的隔离级别

  • 设置全局数据库的事务隔离级别为“读提交” (下一次会话生效):set global transaction isolation level READ COMMITTED;
mysql> set global transaction isolation level  READ COMMITTED;
Query OK, 0 rows affected (0.00 sec)
  • 查看当前数据库事务隔离级别:show variables like 'transaction_isolation';
mysql> show variables like 'transaction_isolation';
+-----------------------+----------------+
| Variable_name         | Value          |
+-----------------------+----------------+
| transaction_isolation | READ-COMMITTED |
+-----------------------+----------------+
1 row in set (0.00 sec)

事务隔离的实现

在 MySQL 中,实际上每条记录在更新的时候 除了记录变更记录,还会记录一条变更相反的回滚操作记录,前者记录在 redo log,后者记录在 undo log

假设一个值从 1 被按顺序改成了 2、3、4,在回滚日志里面就会有类似下面的记录。

Untitled

在可重复读隔离级别中,表中的数据其实已经改变,在前面的视图里,需要查找某条记录时,是通过取当前数据,再取视图对应的回滚段回滚到该视图的值。

回滚日志什么时候才能删除呢 ?

  • 读操作产生读视图,当这个事务结束后该视图删除,那么在这个读视图后的回滚日志可以删除,因为已经没有谁会驱动当前版本的数据执行回滚到删除的那个读视图版本了
  • 当没有比回滚日志更早的读视图(读视图在事务开启时创建)的时候,这个数据不会再有谁驱使它回滚了,这个回滚日志也就失去了用武之地,可以删除了
  • 回滚日志 是被 purge线程回收的

长事务会带来哪些问题 ?

  • 占有锁资源,可能拖垮整个库
  • 长事务可能导致暂时需要保存很多的 undo log,会占用内存空间

事务的启动方式

  1. 显式启动事务语句,begin 或者 start transaction,提交 commit,回滚 rollback
  2. set autocommit=0,该命令会把这个线程的自动提交关掉。这样只要执行一个select语句,事务就启动,并不会自动提交,直到主动执行 commit 或 rollback 或 断开连接。
  • 建议使用方式一,如果考虑多一次交互问题,可以使用 commit work and chain 语法
    • autocommit=1 的情况下用 begin 显式启动事务
    • 如果执行 commit 则提交事务。如果执行 commit work and chain 则提交事务并自动启动下一个事务
  • 建议使用 set autocommit=1 来显式启动事务
  • commit work and chain:提交事务并开启下一个事务(少执行一个begin语句)

查询持续时间超过60秒的事务

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;

mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;
Empty set (0.01 sec)
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:36:19  更:2022-03-12 17:37:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:52:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码