《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·006【事务】
文章目录
- 一、事务
- 1、事务介绍
- 2、事务组成
- 3、事务结束
- 4、MySQL事务处理
- 5、保存点与回档
- 6、事务隔离级别
- 7、脏读、不可重复读、幻读
一、事务
1、事务介绍
事务,也称工作单元,是由一个或多个SQL语句所组成的操作序列。
这些SQL语句作为一个完整的工作单元,要么全部成功,要么全部失败。
通过事务来保证数据的一致性。
就比如说转账,A转给了B一共100元,那么A就要减少100元,B就要增加100元。
也就是说下面两条SQL语句要么全部成功,要么全部失败,不能存在中间状态。
update A set s = s-100;
update B set s = s+100;
事务有以下特点:
- 原子性
事务要么全部成功,要么全部失败。 - 一致性
一旦事务完成(不论成功还是失败),整个系统处于数据一致的状态。 - 隔离性
一个事务的执行不会被另一个事务所干扰。
比如两个人同时从一个账户取钱,应当保证余额正确。 - 永久性
事务一旦提交,对数据的改变就是永久的,不可以再被回滚。
2、事务组成
一个事务可以由以下任意一种形式组成:
- 一组相关的DML、DQL语句,再加上一个TPL语句(
commit
、rollback
) - 一组相关的DML、DQL语句,再加上一个DDL语句(
create
、alter
、drop
、truncate
……) - 一组相关的DML、DQL语句,再加上一个DCL语句(
grant
、revoke
)
3、事务结束
显式结束
- TPL语句
commit
——提交
rollback
——回滚
隐式结束
- 隐式提交
DDL语句——create
、alter
、drop
、truncate
、rename
DCL语句——grant
、revoke
- 隐式回滚
客户端强制关闭
客户端连接异常
系统崩溃
4、MySQL事务处理
方法一:通过begin
、rollback
、commit
来实现
beigin
——开始一个事务rollback
——事务回滚commit
——事务提交
方法二:直接set
改变MySQL的自动提交样式
MySQL默认自动提交,也就是提交一个SQL就直接执行。
set autocommit = 0
——禁止自动提交set autocommit = 1
——开启自动提交
当set autocommit = 0
之后,所有的SQL语句都将作为事务处理,直到用commit
/rollback
结束
注:MySQL只有InnoDB引擎支持事务。
5、保存点与回档
想要回滚到指定位置,而不是回滚到事务的起点,可以通过savepoint
来实现
savepoint 保存点名; -- 定义一个保存点
rollback to 保存点名; -- 回滚到指定保存点
注:savepoint
和rollback to
两个语句都不会结束事务的执行
6、事务隔离级别
隔离级别 | 英文 | 备注 |
---|---|---|
读未提交 |
read uncommitted
|
一般不用,没有隔离,存在“脏读”问题 |
读提交 |
read committed
|
Oracle默认 解决了“脏读”问题 存在着“幻读”问题 |
可重复读 |
repeatable read
|
MySQL默认 同时解决了脏读和幻读 |
串行化 |
serializable
|
用得很少,并发性差 |
可以通过以下SQL语句来查看MySQL当前会话的事务隔离级别
select @@tx_isolation;
MySQL可重复读举例
虽然网上总是流传着事务隔离级别为“可重复读”的时候会同样存在着“幻读”的问题,但是也有说法指出,MySQL的InnoDB引擎实现的“可重复读”通过mvcc机制避免了这种幻读现象。从上面的例子来看,后者的说法应该更为准确一些。
7、脏读、不可重复读、幻读
可以参考这位博主的见解——https://www.cnblogs.com/yubaolee/p/10398633.html
脏读
脏读就是指,当事务A正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,事务B也访问这个数据,然后使用了这个数据。
因为这个数据是还没有提交的数据,那么事务B读到的这个数据是脏数据。
依据脏数据所做的操作可能是不正确的。
不可重复读
不可重复读可以理解为,当事务A第一次查询某个表T的某个记录,得到一个记录R1,然后事务B对刚刚查询的同一条记录进行了更新,再然后事务A第二次进行了同样的查询,得到了一个记录R2,发现R2与R1不同。
在这种情况下,如果事务A和事务B对同一条记录进行了更新,后完成的事务会造成先完成的事务的丢失。
幻读
幻读可以理解为,当事务A第一次查询某个表T,得到了一个结果集S1,然后事务B对表T增加/删除/修改了某个/某些数据,再然后事务A第二次进行了同样的查询,得到了一个结果集S2,发现S2与S1不同。
虽然看上去和不可重复读差不多,但是幻读强调结果集合的增减,不单单只是一条记录。
《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·006【事务】相关推荐
- 阿里云原生数据仓库AnalyticDB MySQL版学习
阿里云原生数据仓库AnalyticDB MySQL版是融合数据库.大数据技术于一体的阿里云原生企业级数据仓库服务.AnalyticDB MySQL版支持高吞吐的数据实时增删改.低延时的实时分析和复杂E ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·001【数据库基本概念、MySQL安装与介绍】
文章目录 一.数据库基本概念 1.DB与DBMS 2.数据库系统的构成 3.数据管理发展过程 4.数据库 5.关系型数据库 二.MySQL安装与卸载 三.与MySQL相关的常用命令 四.MySQL相关 ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·007【简单查询】
文章目录 一.select语句 1.作用 2.语法 3.空值处理 4.反引号.单引号.双引号 5.列和表的别名 6.distinct去重 7.查询表结构 8.条件查询 (1).限定条件 (2).常用比 ...
- 《SQL高级应用和数据仓库基础(MySQL版)》作业 ·007
问题描述 1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪.2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得 (不考虑奖金部分,年薪的试用期6个月的月薪+转 ...
- 《SQL高级应用和数据仓库基础(MySQL版)》作业 ·006
文章目录 问题列表 参考解答 前提补充 注意点整理 分解代码 整体代码 问题列表 1.使用如下语句,建立以下表 create table copy_emp (empno int(4),ename va ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·005【表的CRUD操作(DML语句)】
文章目录 一.表的CRUD操作(DML语句) 1.insert语句 2.update语句 3.delete语句 二.其他注意点 1.MySQL查询区分大小写的方式 2.truncate语句与delet ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·011【视图和索引】
文章目录 一.视图 1.介绍 2.作用 3.使用示例 4.视图上的DML操作 二.索引 1.介绍 2.作用 3.分类 4.创建 4.删除 5.验证 一.视图 1.介绍 视图是指计算机数据库中的视图,是 ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·010【高级查询】
文章目录 一.分组函数(聚合函数) 1.介绍 2.格式 3.常用函数 (1).MIN函数.MAX函数 (2).SUM函数.AVG函数 (3).COUNT函数 4.group by子句 5.having ...
- 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·008【常用函数】
文章目录 一.常用函数 1.建议 2.MySQL函数概述 3.常用函数分类 一.常用函数 1.建议 使用函数时,建议将MySQL升级为8.0版本 2.MySQL函数概述 单行函数 语法 函数名(参数列 ...
最新文章
- C语言结束输入(两种方法)
- 图解:电商支付架构设计
- ARM与RISC-V之争,后起之秀的优势在哪儿?
- [NOIp提高组2017]宝藏
- Hive_ 对比分区,分桶
- 测试计划(GB8567——88)
- 前端学习(1365):express框架导读
- 论文学习10-Joint entity recognition and relation extraction as a multi-head selection problem(实体关系联合抽取模型
- SpringBoot使用ResponseBodyAdvice进行统一响应处理
- GCC options总结
- oracle rac 启动失败has,oracle11.2.0.4 rac asm启动故障
- 13.xsi:schemaLocation详解
- bash给脚本加进度条_shell脚本实现进度条
- 【路径规划】基于matlab A星+改进A星的路径规划【含Matlab源码 225期】
- 我转行程序员的那一年(四)
- 阿里巴巴分布式调度引擎tbschedule实战四tbschedule的配置使用
- 《人月神话》出版后的网友评论
- JPA如何查询部分字段
- 攻击机靶机环境搭建——网络设置
- windows10下安装Vue.js的方法
热门文章
- 1核1g java_wordpress博客1核1G1M够用吗
- java 扫描自定义注解_利用spring 自定义注解扫描 找出使用自定义注解的类
- android自定义滚轴选择器_Android自定义控件实战—滚动选择器PickerView
- php 8发布,PHP 8.0.0 正式版发布啦,一个崭新时代来临!
- mysql5.5.48安装教程_Linux虚拟机下MySQL-server-5.5.48-1安装教程
- 用java制作心理测试软件_Java 程序员必备的10款开源工具
- c语言中常用符号,C语言中常用的符号.doc
- linux下mysql5.7创建用户_Linux下mysql5.7 创建、删除用户与授权
- Iranian ChamPions Cup 水题
- 《深度学习笔记》——loss函数的学习笔记