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(14)——事务 -> 正文阅读

[大数据]Mysql(14)——事务

概念

一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元
只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务要么全部执行成功,要么全部失败。

所以记住事务的几个基本概念,如下:

  • 事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行的原子操作。
  • 事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。
  • 事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。

( 回滚依靠的是redo log【重做日志】和undo log【回滚日志】,这些内容之后会有讲解)

注意:MyISAM是不支持事务的,InnoDB最大的特点就是:支持事务,支持行锁。

在这里插入图片描述

ACID特性

每一个事务必须满足下面的4个特性:

  1. 事务的原子性(Atomic):[事务执行本身]
    事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成。
  2. 事务的一致性(Consistency):[事务对数据具有一致性]
    一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务。
  3. 事务的隔离性(Isolation):[并发执行能力的体现,看隔离的级别]
    当两个或者多个事务并发执行时,为了保证数据的安全性将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响
  4. 事务的持久性(Durability)
    事务完成(commit)以后,DBMS保证它对数据库中的数据的修改是永久性的,即使数据库因为故障出错,也应该能够恢复数据(redo log保证数据库的永久性,mysql最重要的是日志,不是数据)

注意:

  • ACD是由redo log和undo log机制来保证的;
  • I是由mysql的锁机制来保证的。

学习了上面四个事务的特性,隔离性就是事务并发能力的体现,那么事务既然能够并发,如果不加隔离,就会涉及到安全的问题,以下将会列举一些事务并发存在的问题:

事务并发存在的问题

事务处理不经隔离,并发执行事务时通常会发生以下的问题

  • 脏读(Dirty Read)一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据(亦或是处理到一半的数据),如果此时事务A回滚,则事务B读到的数据就是无效的脏数据。(事务B读取了事务A尚未提交的数据,是必须要杜绝的问题
  • 不可重复读(NonRepeatable Read)一个事务的操作导致另一个事务前后两次读取到不同的数据。 例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样(事务B读取了事务A已提交的数据)(从实际情况开看是否需要处理)
  • 虚读(Phantom Read)幻读一个事务的操作导致另一个事务前后两次查询的结果数据量不同。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。(事务B读取了事务A新增加的数据或者读不到事务A删除的数据)(从实际情况开看是否需要处理)

小总结

  1. 出现脏读,事务A还未提交,此时被另外一个事务B读取,这是一定要杜绝的问题;
  2. 不可重复读和幻读都是事务B看到数据有变化,事务A已经提交了,此时需不需要处理需要看业务的实际需求。

事务处理命令

打开MySQL的Command命令行窗口,测试以下命令:
1、SELECT @@AUTOCOMMIT; 查看MySQL是否自动提交事务

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|             1|
+--------------+
1 row in set (0.00 sec)
  • 0表示手动提交事务
  • 1表示自动提交事务
  • 设置事务提交方式为手动提交方式:
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
  • BEGIN; 开启一个事务
  • COMMIT; 提交一个事务
  • ROLLBACK; 回滚一个事务到初始的位置
  • SAVEPOINT point1; 设置一个名字为point1的保存点
  • ROLLBACK TO point1; 事务回滚到保存点point1,而不是回滚到初始状态
  • SET TX_ISOLATION=‘REPEATABLE-READ’; 设置事务的隔离级别
  • SELECT @@TX_ISOLATION; 查询事务的隔离级别
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |  可以看到MySQL默认工作在可重复读级别
+-----------------+
1 row in set, 1 warning (0.00 sec)

事务的隔离级别

MySQL支持的四种隔离级别是:

  1. TRANSACTION_READ_UNCOMMITTED未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的。
  2. TRANSACTION_READ_COMMITTED已提交读。[Oracle默认]。说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生。
  3. TRANSACTION_REPEATABLE_READ可重复读。[mysql默认],说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。
  4. TRANSACTION_SERIALIZABLE串行化。单线程操作,并发能力最低,是最高的事务级别,它防止读脏数据,不可重复读和虚读。 (很少使用,因为并发能力太弱)

在这里插入图片描述

备注:

  • 事务隔离级别越高,为避免冲突所花费的性能也就越多。
  • 在“可重复读”级别,实际上可以解决部分的虚读问题,但是不能防止update更新产生的虚读问题,要禁止虚读产生,还是需要设置串行化隔离级别。

实操演示

1、未提交读:发生脏读

在这里插入图片描述

2、已提交读:防止了脏读,但发生了不可重复读

在这里插入图片描述

3、可重复读:防止了脏读和不可重复读,但会发生幻读

在这里插入图片描述

可重复读一定程度上可以防止幻读的出现:可以防止insert和delete,但是不能防止update:
①防止了insert
在这里插入图片描述

②无法防止幻读
在这里插入图片描述

4、串行化:由一把读写锁控制

在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:37:48  更:2022-03-24 00:39:42 
 
开发: 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 7:00:17-

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