MySQL事务、四大原则、执行步骤、四种隔离级别、锁、脏读、脏写等

MySQL事务

  • MySQL事务
      • 1.什么是事务?
      • 2.事务的四大原则
      • 3.事务执行的步骤
      • 4、事务的隔离性
      • 5、MySQL中的锁

MySQL事务

模拟一个转账业务:

在这里插入图片描述

上图中的sql语句:
update from table set money = mongey - 100 where name = 'A';
update from table set money = mongey + 100 where name = 'B';

但是如果将A姓名或转B姓名写错就会出现,A的金额减掉了,但是B未增加;或者是A的金额未减掉了,但是B增加了,这样就造成了数据库中数据不一致;而事务恰好能解决这个问题。

1.什么是事务?

事务(Transaction):就是将一组sql语句放在同一批次内执行,如果出现sql语句执行错误,则该批次内的所有sql都将取消执行。MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务。

事务的特点:一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会操作失败,数据库数据就会回滚到该事务开始之前的状态。

2.事务的四大原则

  • 原子性

数据库中的事务执行作为原子粒度,要么都执行成功,要么都不成功,不存在执行部分成功,部分失败的情况。

  • 一致性

一致性是指事务在执行开始之前和结束之后,数据库的完整性约束没有被破坏,至于中间的过程就没有强行规定,只强调初始状态和结束状态。

  • 隔离性

事务的执行是互不干扰的,一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事物之间不能互相干扰;数据库通过加锁来保证事物之间的隔离性。

  • 持久性

持久性是指,事务执行成功后,无论是提交还是回滚,对数据库中的数据改变都是持久性的。

3.事务执行的步骤

步骤一:关闭MySQL的自动提交(MySQL默认开启的是自动提交;1开启;0关闭)
set autocommit = 0;
步骤二:开启一个事务,标记事务的起始点
start transaction;
步骤三:执行一组sql语句update salary set salary = salary + 500 where Sname = '张三';update salary set salary = salary - 500 where Sname = '李四';
步骤四或步骤五:向数据库提交事务操作
commit;	
步骤四或步骤五:将事务回滚,所有的数据库操作被取消,数据将回到最初的状态。
rollback;
步骤六:开启MySQL自动提交
set autocommit = 1;

这样就解决了上面转账的问题,只有当A和B都执行成功的时候然后再commit,数据才会被保存进数据库中;有错误rollback数据就会回到初始状态。但是注意,回滚或者提交是人主观控制,有sql语句未执行是主观判断可以提交也是可以的;所有都正确执行是也可以选择回滚。

4、事务的隔离性

事务的隔离性:为了让不同的事物之间不存在相互干扰,就需要对事务的操作进行隔离,事务的隔离性也就是将操作同一数据的事务相互分离开,让操作之间分开有序的执行。

实现事务隔离的方式:通常数据库都是采用锁的机制,保证事务之间的隔离性。

5、MySQL中的锁

锁的分类:

  • 基于锁的属性分类:共享锁(读锁、S锁)、排他锁(写锁、X锁)
  • 基于锁的粒度分类:表锁、行锁(记录锁、间隙锁、临键锁)
  • 基于锁的状态分类:意向共享锁、意向排他锁

事务的并发问题:在事务并发执行的时候,如果不进行事务的隔离,那么就会产生脏读、脏写、重复读、幻读的问题;

  • 脏读: 一个事务读取了另一个事务未提交的数据。

    示例: 事务A修改了一行数据,但尚未提交。事务B读取了这行未提交的数据,然后事务A回滚。此时,事务B读取的数据实际上是无效的,是“脏”的。

  • 脏写: 一个事务覆盖了另一个事务已经提交的数据。

    示例: 事务A修改了一行数据并提交,然后事务B修改了同一行数据并提交。事务B的提交导致了对事务A的修改的丢失,这是一种“脏写”。

  • 重复读:在一个事务内,两次读取同一行数据,但在两次读取之间有其他事务修改了这行数据。

    示例: 事务A读取了一行数据,然后事务B修改并提交了这行数据。接着,事务A再次读取相同的数据,发现数据已经发生了变化。这就是“重复读”。

  • 幻读: 在一个事务内,两次查询返回了不同数量的行,但在两次查询之间有其他事务插入了新的数据。

    示例: 事务A查询某个条件下的所有数据,然后事务B插入了符合该条件的新数据。接着,事务A再次查询相同的条件,发现返回的行数发生了变化,即出现了“幻读”。

事务的隔离级别:

  1. READ_UNCOMMITTED 读未提交
  2. READ_COMMITTED 读提交(不可重复读)
  3. REPEATABLE_READ 可重复读
  4. SERIALIZABLE 串行化

每个隔离级别都针对事务并发问题中的一种或几种进行解决,事务级别越高,解决的并发事务问题也就越多,同时也就意味着家的锁就越多,所以性能也会越差。

事务的隔离级别解决的问题:

隔离级别事务读取事务写入解决问题存在问题
READ_UNCOMMITTED不加锁加写锁脏写脏读、不可重复读、幻读
READ_COMMITTED加读锁(每次select完都会释放读锁)加写锁脏读、脏写不可重复读、幻读
REPEATABLE_READ加读锁(每次select完不会释放锁,而是事务结束后才会释放)加写锁脏读、脏写、不可重复读、幻读(mysql的innodb已经解决)幻读(mysql的innodb不存在)
SERIALIZABLE不论是读还是写所有的事务串行化执行,一个事务的执行必须等其他事务结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305557.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rime中州韵 symbols.custom.yaml 配置

今天我们所做的配置,将实现扩展符号的输入效果,如下👇: 基础扩展符号的配置 要实现输入法能够输入扩展的符号,我们需要在输入方案中引入扩展符号集。 如果你使用的输入方案是 wubi_pinyin.schema.yaml,…

linux用户态与内核态通过字符设备交互

linux用户态与内核态通过字符设备交互 简述 Linux设备分为三类,字符设备、块设备、网络接口设备。字符设备只能一个字节一个字节读取,常见外设基本都是字符设备。块设备一般用于存储设备,一块一块的读取。网络设备,Linux将对网络…

【数据结构】插入排序、选择排序、冒泡排序、希尔排序、堆排序

前言:生活中我们总是会碰到各种各样的排序,今天我们就对部分常用的排序进行总结和学习,今天的内容还是相对比较简单的一部分,各位一起加油哦! 💖 博主CSDN主页:卫卫卫的个人主页 💞 &#x1f44…

3DMAX 中的 VR 渲染器如何设置局部区域渲染?

3DMAX 中的 VR 渲染器如何设置局部渲染? 首先我们要得打开渲染设置,在3damx里按F10,调出渲染设置。选定渲染器为Vary渲染器: 设置VR的局部渲染,需要打开帧缓冲,我们在V-ary项下,打开帧缓冲(点击…

分页展示30条数据,却出来老多数据???

问题1:一开始我在页面上写了一个分页,只展示30条数据 但是展示了很多数据 问题所在: 因为我循环套循环,list数据和customer相乘(所以分页出现老多数据。) 问题2:(实际上是可以直接…

canal 数据同步组件

canal 数据异构组件 为啥要使用这个组件? 在更新DB的时候不同步更新到redis,es等数据库中,时间太久,而且可能会存在同步失败的问题,因此引入canal去拉取DB的数据,再去更新到redis,es等数据库中&…

深度学习核心技术与实践之深度学习基础篇

非书中全部内容,只是写了些自认为有收获的部分 神经网络 生物神经元的特点 (1)人体各种神经元本身的构成很相似 (2)早期的大脑损伤,其功能可能是以其他部位的神经元来代替实现的 (3&#x…

CSS 向上扩展动画

上干货 <template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container&q…

深入理解Mysql MHA高可用集群搭建:从实验到实战

1. 简介 MHA&#xff08;Master High Availability&#xff09;是一个高效的开源MySQL高可用性解决方案。由日本开发者yoshinorim&#xff08;前DeNA员工&#xff0c;现在Facebook&#xff09;创建&#xff0c;MHA支持MySQL的主从复制架构&#xff0c;自动化主节点故障转移。当…

使用pytorch搭建ResNeXt并基于迁移学习训练

冻结除最后全连接层以外的所有权重&#xff0c;只去单独训练它最后一层的的权重&#xff0c;这个方法&#xff0c;冻结了所有网络的权重。 for param in net.parameters():param.requires_grad False

如何利用VR全景做好品牌营销?

VR全景技术能够为用户创造全新而沉浸式的体验&#xff0c;现在已经成为了品牌营销领域的重要工具。越来越多的企业开始在互联网上对自己进行宣传推广&#xff0c;但是线上推广渠道也是有很多的&#xff0c;该选择哪一种渠道更适合企业呢&#xff1f;现阶段又如何利用VR全景做好…

TPRI-DMP平台介绍

TPRI-DMP平台介绍 TPRI-DMP平台概述 TPRI-DMP为华能集团西安热工院自主产权的工业云PaaS平台&#xff0c;已经过13年的发展和迭代&#xff0c;其具备大规模能源电力行业生产应用软件开发和运行能力。提供TPRI-DMP平台主数据管理、业务系统开发与运行、应用资源管理与运维监控…