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加强(7)~事务、事务并发、解决事务并发的方法 -> 正文阅读

[大数据]mysql加强(7)~事务、事务并发、解决事务并发的方法


一、事务Transaction(简写tx):

在数据库中,事务是指一组逻辑操作不可分割的多个操作—一个事务,从一个状态变成另外一个状态。),无论成或败,都作为一个整体进行工作,要么全部执行,要么全部不执行。


引入背景:银行转账突遇断电的bug


1、事务的ACID属性:

① 原子性:事务是满足原子操作单元的,要么都执行,要么都不执行。

② 一致性:事务必须使数据库从一个一致性状态变成另外一个一致性状态。事务开始和完成,数据必须保持一致。(数据不被破坏)‘数据守恒’】

③ 隔离性:事务之间有各自的空间,事务之间不被打扰。并发执行的事务之间彼此相互独立、互相不干扰.

④ 持久性:事务一旦提交后,数据是永久性的、不可回滚。(数据的修改是永久的)

事务只是一个改变,是一些操作的集合,事务本身不具备4个特性,但是我们需要让事务满足ACID特性,才能称它为一个正确的事务。

■ 在开发中,我们可以不使用外键,但是必须要有事务(存储引擎- innoDB)


■ 处理事务的两个动作:

  • 提交 commit:当整个事务中,所有的逻辑操作都是正常执行成功。 --》提交事务

  • 回滚 rollback:当整个事务中,有一个或多个逻辑操作执行失败。 --》回滚事务,撤销该事务中所有的操作,恢复到最初的状态。



2、隔离级别:

  • 事务的ACID特性中的隔离性是具有级别的哈,所以才有事务并发出现的各种情况。

  • 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

  • mysql 是使用可重复读取(Repeatable Read), 保证了数据的读取一致性,避免了脏读、不可重复读。

    • 默认情况,mysql不会出现幻读[除非 select * from 表名 lock in share mode;]
    • mysql中锁是基于索引机制,也不会出现第一类丢失更新(回滚丢失)
    隔离级别脏读不可重复读幻读
    oracle—读已提交(只是避免了脏读)
    mysql—可重复读取(避免了脏读和不可重复读)

■ mysql中的4种隔离级别(重点看是否会出现脏读、不可重复读、幻读即可)在这里插入图片描述

  • ■ 这里最严重的就是丢失更新问题【第一类丢失更新(回滚丢失)、第二类丢失更新(覆盖丢失)】

    • 读取未提交:会出现脏读,还有事务A的数据仍然会因为事务B的insert/update、delete 从而出现幻读、不可重复读

    • 读取已提交:未提交的写操作的事务不允许被其他事务访问到。避免了脏读,但是事务A的数据,仍然会因为事务B的insert/update、delete 从而出现幻读、不可重复读。

    • 可重复读取:避免了不可重复读,但是却有可能出现幻读。

    • 序列化:要求事务一个接着一个进行执行,不可能并发执行。



二、事务并发

1、数据库的事务并发问题:多个事务并发访问/修改**同一个资源**

★ 跟java中的线程问题—并发问题差不多,都是针对同一资源,同时访问/修改出现的问题。


事务并发可能导致的问题【例子:两个客户端同时对同一个银行账号进行操作,一个客户端进行存取,一个客户端进行取钱】

(1)第一类丢失更新:撤销rollback一个事务时,把其他事务已经提交更新的数据回滚掉了

(2)第二类丢失更新:提交commit一个事务时,把其他事务已经提交更新的数据覆盖掉了。

(3)脏读:A事务未提交,但是B事务却读取到A事务的结果【读取到了B事务未提交的结果】(破坏隔离性)

(4)幻读:A事务在本次事务中,自己未操作过的数据B事务insert了一些数据),A事务进行两次读取,发现第一次读取时,记录不存在,第二次读取,记录出现了(破坏一致性,insert)

(5)不可重复读:跟幻读类似,A事务在本次事务中,自己未操作过的数据B事务update/delete了一些数据),A事务进行两次读取,发现两次读取的记录值不同(破坏一致性,update/delete)


? 每一个事务是有自己的空间的概念

  • 【第一类丢失更新】回滚丢失,把前一个提交的事务的结果回滚到数据库最初的数在这里插入图片描述
  • 【第二类丢失更新】覆盖丢失,通过提交事务,把前一个提交的事务的结果给覆盖掉在这里插入图片描述
  • 脏读: 事务A读到事务B未提交的更新数据 (Oracle不会出现脏读)在这里插入图片描述
  • 幻读:事务A第二次查询时,读到了事务B新增提交的数据,即事务A两次查询时的记录条数不同,“产生幻觉”。【一般使用表锁机制,防止新增数据。】在这里插入图片描述
  • 不可重复读:跟幻读类似(只是幻读是读到事务B新增数据),事务A第二次查询时,读到了事务B修改提交的数据,即事务A两次查询时的结果的值不同不同在这里插入图片描述



三、解决事务并发的方法(悲观锁/乐观锁)

1、悲观锁:事务A在操作时,悲观地认为其他事务会进来干扰自己。—[用的比较多,非常安全]。

(1)悲观锁:使用数据库自身的排它锁机制 [★原理数据库自身的锁机制(写锁)]

  • DML操作会自动加上排它锁(排斥其他锁)
  • DQL操作需要我们手动加上排它锁
    • select * from 表名 for update;

■ 使用客户端工具Navicat模拟(开启两个命令行窗口,可以拖动出来方便查看)并发:在这里插入图片描述

  • DML操作会自动加上排它锁(排斥其他锁)
    在这里插入图片描述在这里插入图片描述

  • DQL操作需要我们手动加上排它锁
    在这里插入图片描述

■ 查询事务加上了 for update,其中一个事务处于阻塞状态,等着另一个事务的提交或回滚。
在这里插入图片描述



2、乐观锁:事务A在操作时,乐观地认为其他事务不会进来干扰自己。

(1) ★原理:在表中额外添加一个列,用来表示修改的版本(整型类型),修改一次就把版本增加1.

  • 举例:事务A并发修改person表中的name字段。
    在这里插入图片描述在这里插入图片描述

(2)乐观锁的操作步骤:在这里插入图片描述

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

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