当前位置: 首页 > news >正文

数据库(mysql)之事务

目录

一、mysql事务

1、事务的概念

2、事务的ACID特点

2.1原子性

2.2一致性

2.3隔离性

2.4持久性

3、事务之间的相互影响

3.1脏读(读取未提交的数据)

3.2不可重复读(前后多次读取,数据内容不一致)

3.3幻读(前后多次读取,数据总量不一致)

3.4丢失更新

4、mysql事务隔离级别

4.1查询全局事务隔离级别

​编辑4.2查询会话事务隔离级别

 4.3设置全局事务隔离级别

 4.4设置会话事务隔离级别

 5、数据控制语句

5.1测试提交事务

 5.2测试回滚事务

 5.3测试多点回滚

 5.4使用set设置控制事务


一、mysql事务

1、事务的概念

  • 事务是一种机制、一个操作序列,包括了一组数据库操作指令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
  • 事务适合于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等
  • 事务是通过事务的整体性以保证数据的一致性

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位

2、事务的ACID特点

ACID:是指在可靠数据库管理系统中,事务应该具有的四个特性:原子性、一致性、隔离性、持久性。这是可靠数据库所具备的几个特性

2.1原子性

原子性:指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生

  • 事务是一个完整的操作,事务的各元素是不可分的
  • 事务中的所有元素必须作为一个整体提交或回滚
  • 如果事务中的任何元素失败,则整个事务将失败

以begin为开始,以commit为结束,这里面的语句有原子性,要么都发生,要么都不发生。
例如:被begin和commit括起来的几条语句,如果其中有一条语句报错,那么整条语句都不会执行。只有全部执行了,括起来的语句才会生效。这就是原子性

2.2一致性

一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏

  • 当事务完成时,数据必须处于一致状态
  • 当事务开始前,数据库中存储的数据处于一致状态
  • 当正在进行的事务中,数据可能处于不一致的状态
  • 当事务成功完成时,数据必须再次回到已知的一致状态

就是在我们执行事务前和事务后,修改的数据库内容需要保存到磁盘中。展现给我们看的内容和存储在磁盘的内容需要一一致。

2.3隔离性

隔离性:指在并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自的完整数据空间

  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应该以任何方式依赖于或影响其他事务
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务之后访问这些数据

当同一个数据库中的两个表被两个不通事务修改同一条记录时,两条事务是相对独立的。不会相互干预对方的执行后果,只有先后的顺序来决定最后的数据内容。(数据在修改时,是串行的,必须得一个事务一个事务的执行)

2.4持久性

持久性:在事务完成以后,该事务所对数据库所做的更改便持久保存在数据库之中,并不会被回滚

  • 指不管系统是否发生故障,事务处理的结构都是永生的
  • 一旦事务被提交,事务的效果会被永久的保留在数据库中

当事务执行完成之后,事务所修改的数据,将会永久保存在磁盘当中。且无法进行撤销和回滚。除非没有commit提交,可以进行修改。

3、事务之间的相互影响

3.1脏读(读取未提交的数据)

脏读是读到了别的事务回滚前的脏数据。比如说事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读

也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据

3.2不可重复读(前后多次读取,数据内容不一致)

一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的,事务A第一次查询得到一行记录row1,事务B提交修改后,事务A第二次查询得到row1,但列的内容发生了变化

3.3幻读(前后多次读取,数据总量不一致)

一个事务内对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户会发现表中还有没有修改的数据行,就好像发生了幻觉一样

两个事务对同一个数据进行操作,一个删除了,一个又插入了,那么删除的事务就会觉得产生了幻觉一样

3.4丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后,B的修改结构覆盖了A的修改结果

4、mysql事务隔离级别

隔离级别解决的问题:解决的是执行并发事务之后,数据不一致的问题

  • read uncommitted:读取尚未提交的数据,不可解决脏读
  • read committed:读取已经提交的数据,可以解决脏读
  • repeatable read:重复读取,可以解决脏读和不可重复读(MySQL默认)
  • serializable:串行化,可以解决脏读、不可重复读和虚读(相当于锁表)

MySQL默认的事务处理级别是repeatable read,而Oracle和SQL Server是read committed

4.1查询全局事务隔离级别

show global variables like '%isolation%';  #两个%%代表模糊查询
SELECT @@global.tx_isolation;

4.2查询会话事务隔离级别

show session variables like '%isolation%';
select @@session.tx_isolation;
select @@tx_isolation;

#三种查询会话事务的隔离级别

 4.3设置全局事务隔离级别

set global transaction isolation level serializable;  

#将全局事务隔离级别设置成串行化 

show global variables like '%isolation%';    #查询全局事务的隔离级别

 4.4设置会话事务隔离级别

set session transaction isolation level read committed;
#修改会话事务隔离级别为读取已提交的数据
select @@tx_isolation;   #查看会话事务隔离级别

 5、数据控制语句

BEGIN 或 START TRANSACTION:显式地开启一个事务。
COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;“S1”代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

5.1测试提交事务

create user 'yyh'@'localhost' identified by '123456';  创建登录数据库的新用户
grant select on ye.* to 'yyh'@'localhost' identified by '123456';  给用户一个查看的权限
show grants for yyh@localhost; 查看用户权限

 

 5.2测试回滚事务

 5.3测试多点回滚

 

 

 5.4使用set设置控制事务

show variables like 'autocommit';
#查看mysql中是否自动提交索引

set autocommit=0;
#禁止自动提交

set autocommit=1;
#开启自动提交

 

相关文章:

  • MapReduce基础入门1
  • 嵌入式系统开发笔记88:认识51微控制器系统架构
  • monorepo
  • ReentrantLock源码解析
  • 矩阵的运算规则
  • 公众号查题方法-授权即可使用
  • ElasticSearch(二)【Kibana】
  • Shell-基础(一):Shell解释器、Shell脚本
  • 项目后端环境和前端环境的搭建
  • 8.Docker MySQL 主从复制
  • 深度学习环境配置10——Ubuntu下的torch==1.7.1环境配置
  • 【C++】初窥C++
  • 12、Java——对象和类案例代码详解
  • 26、Java 简单实现单例设计模式(饿汉式和懒汉式)
  • 创建对象在堆区如何分配内存
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 4个实用的微服务测试策略
  • CSS居中完全指南——构建CSS居中决策树
  • IDEA常用插件整理
  • isset在php5.6-和php7.0+的一些差异
  • python 装饰器(一)
  • Python连接Oracle
  • sublime配置文件
  • vue-router 实现分析
  • 闭包--闭包之tab栏切换(四)
  • 程序员该如何有效的找工作?
  • 创建一个Struts2项目maven 方式
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 区块链分支循环
  • 如何利用MongoDB打造TOP榜小程序
  • 数据仓库的几种建模方法
  • 微信小程序:实现悬浮返回和分享按钮
  • 物联网链路协议
  • 小李飞刀:SQL题目刷起来!
  • 延迟脚本的方式
  • 一个完整Java Web项目背后的密码
  •  一套莫尔斯电报听写、翻译系统
  • 应用生命周期终极 DevOps 工具包
  • ionic异常记录
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 从如何停掉 Promise 链说起
  • ​TypeScript都不会用,也敢说会前端?
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (阿里云万网)-域名注册购买实名流程
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (转)http协议
  • (转)jdk与jre的区别
  • (转)setTimeout 和 setInterval 的区别