Mysql学习日记:L24-事务
目录
一、事务概述
二、和事务有关的DML语句
三、对事务的理解
四、事务的实现
4.1 事物的实现原理
4.2 事务的提交与回滚
五、事务的特性
5.1 A:原子性
5.2 C:一致性
5.3 I:隔离性(重点)
5.3.1 事务隔离级别
5.3.2 验证各种隔离级别
5.4 D:持久性
一、事务概述
一个事务就是一个完整的业务逻辑。
事务:transaction
什么是完整的业务逻辑?
假设转账,从A账户转账10000元到B账户。
将A账户的钱减去10000,(相当于update语句)
将B账户的前加上10000,(也相当于update语句)
这就是一个完整的业务逻辑。不可再分
以上的操作是一个最小的工作单元,要么同时成功,要么同时失败,不可再分。
这两个update语句要求必须同时成功或者同时失败,这样才能保证钱是正确的。
二、和事务有关的DML语句
只有DML语句才有事务这一说,其他语句和事务无关
insert
update
delete
只有以上的三个语句和事务有关系,其他的都没关系,因为只有这三个语句是对数据库中的数据进行增、删、改。只要你的操作涉及到数据的增、删、改,那么就一定要考虑到安全问题。
数据安全第一位
三、对事务的理解
问:假设所有的业务,只要一条DML语句就可以完成,还有必要存在事务机制吗?
答:正是因为做某件事的时候,需要多条DML语句共同联合起来才能完成,所以需要事务的存在。如果任何复杂的事都需要DML语句搞定,那么事务则没有存在的价值。
什么是事务呢?
本质上,一个事务其实就是多条DML语句同时成功或同时失败。
四、事务的实现
4.1 事物的实现原理
事务是怎么做到多条DML语句同时成功或同时失败?
InnoDB存储引擎会提供一组用来记录事务性活动的日志文件:
事务开启了
insert
delete
insert
insert
update
事务结束了
在事务的执行过程中,每一条DML都会记录到“事务性活动的日志文件”中。
4.2 事务的提交与回滚
在事务的执行过程中,我们可以提交事务,也可以回滚事务。
提交事务:(commit;语句)(在确定事务无误可以提交时,输入commit;就可以提交)
清空事务性活动的日志文件,将数据全部彻底持久化到数据库表中。
提交事务标志着事务的结束,并且是一种全部成功的结束。
回滚事务:(rollback;语句)(回滚永远只能回滚到上一次的提交点)
将之前所有DML操作全部撤销,并且清空事务性活动的日志文件。
回滚事务标志着事物的结束,并且是一种全部失败的结束。
mysql默认情况下,是支持自动提交事务的。自动提交就是每执行一条DML语句,则提交一次。如果自动提交事务的话就无法回滚。
(可以发现上图在执行rollback后数据并没有发生改变,因为事务已经被自动提交了)
关闭自动提交机制:
执行命令:start transaction;
(在开启事务后,rollback后的数据发生了改变,回滚到了上一个提交点)
五、事务的特性
5.1 A:原子性
说明事务是最小的工作单元,不可再分。
5.2 C:一致性
所有事务要求,在同一个事务当中,所有操作必须同时成功或同时失败,以保证数据的一致性。
5.3 I:隔离性(重点)
A事务和B事务之间有一定的隔离,就像教室A和教室B之间有一道墙
5.3.1 事务隔离级别
A与B教室之间的墙可以厚也可以薄,这就是事务的隔离级别,墙越厚,代表隔离级别越高。
事务和事务的隔离级别有四个:
①读未提交:read uncommitted(最低的隔离级别)《没有提交就读到了》
事务A可以读取到事务B未提交的数据。
这种隔离级别存在的问题是:脏读现象(Dirty Read),读到了脏数据。
这种隔离级别一般是理论上的,大多数数据库隔离级别都是从②开始。
②读已提交:read committed《提交之后才能读到》
事务A只能读取到事务B提交之后的数据。
这种隔离级别存在的问题是:不可重复读取数据:在事务开启之后,第一次读到的数据时3条,当前事务还没有结束,可能第二次再读取的时候,读到的数据是4条,3不等于4,,成为不可重复读取。
这种隔离级别是比较真实的数据,每一次读到的数据都绝对的真实。
这种隔离级别解决了脏读的现象
③可重复读:repeatable read《提交之后也读不到,读取的永远是刚开启事务时的数据》
事务A开启之后,不管是多久,每一次在事务A中读取到的数据都是一致的,即使事务B将数据已经修改并且提交了,事务A读取到的数据还是没有发生改变,这就是可重复读。
这种隔离级别解决不可重复读取数据的现象。
问题是可能会出现幻影读,每一次读取到的数据都是幻象,不够真实。
例:早上9点开启事务,只要事务不结束,到晚上9点,读到的数据还是那样。读到的是假象。
mysql默认的隔离级别就是这个
④序列化/串行化:serializable(最高的隔离级别)
这是最高隔离级别,效率最低,解决了所有的问题。
这种隔离级别表示事务排队,不能并发。
每一次读取到的数据都是最真实的,而且效率是最低的。
5.3.2 验证各种隔离级别
查看当前的隔离级别:
改变隔离级别:
set global transaction isolation level ~;(记得在改变完之后要先退出再登录才能正确显示隔离级别)
被测试的表t_user
a、验证:read uncommitted
①设置全局隔离级别:set global transaction isolation level read uncommitted;退出再重进
②建表t_user
事务A 事务B
------------------------------------------------------------------------------------------------
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values('zhangsan');
select * from t_user;
从上图可以看到在事务A插入数据后,事务B在未提交的情况下就查到了事务A的数据,所以是读未提交,由于事务A未提交,所以在事务A rollback后,事务B读到了回滚的无数据,所以是无结果,这种现象就被称为脏读。
b、验证 read committed
事务A 事务B
------------------------------------------------------------------------------------------------
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
insert into t_user values('zhangsan');
select * from t_user;
commit;
select * from t_user;
在插入数据后,事务B并不能查到事务A的数据,而在事务A提交数据后,事务B才能读取到数据,所以是读已提交。
c、验证repeatable read
事务A 事务B
------------------------------------------------------------------------------------------------
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values('wangwu');
commit;
select * from t_user;
从上图可以看出,即使事务B已经提交了数据,但是事务A读取的仍还是原先的数据,只要事务A不结束,无论事务A读取几次,都是一样的数据,所以是可重复读。而我们在查询了事务B的数据时发现,即使是同一条查询语句,事务A和事务B的查询结果却不一样,这种现象被称为幻读。
d、验证serializable
事务A 事务B
------------------------------------------------------------------------------------------------
use bjpowernode;
use bjpowernode;
start transaction;
start transaction;
select * from t_user;
insert into t_user values('abc');
select * from t_user;
在事务A插入数据后,事务B查询数据光标会一直卡在那里,这是因为两个事务在同时操作t_user这张表,在事务A没有结束时,事务B永远都会排队。当事务A提交之后,事务B开始运行。
5.4 D:持久性
事务最终结束的一个保障。,事务提交,就相当于将没有保存到硬盘上的数据保存到硬盘上。
Mysql学习日记:L24-事务相关推荐
- 【Mysql学习日记2——修改】
系列文章目录 [Mysql学习日记1--排序与修改] 文章目录 系列文章目录 前言 一.修改表的名字(修改) 1.题目要求 2.解题思路 3.代码示例 二.按日期分组销售(查询:非重复计量) 1.题目 ...
- 【MySQL】mysql学习笔记04 事务
– =事务============ – 事务原则:ASID原则 – 原子性 – 一致性 – 隔离性 – 持久性 – mysql是自动开启事务提交的 1.建表 CREATE DATABASE shop ...
- Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)
文章目录 1.事务概述 2.事务特性 3.事务隔离级别 4.演示事务 4.1.演示读未提交 4.2.演示读已提交 4.3.演示可重复读 4.4.演示串行化读 1.事务概述 什么是事务? 一个事务是一个 ...
- mysql开始全部日记,MySQL学习日记—节选SQLZOO习题(1)
前言 最近的开发任务是要从零开始搭建一个网站,刚开始是准备做一个纯前端页面,但是出于后期维护和拓展的考虑,最后还是准备使用MVC框架来搭建,那么开发的第一步就是要建立数据库了,因此这段时间也在学习My ...
- MYSQL学习日记(三)
1. 多表关联查询 1. 内连接 标准语法: select * from 表1 inner join 表2 on 关联条件; 两个表中所有符合关联条件的两条数据,就拼接成一个数据,作为本次查询的一条结 ...
- Mysql学习日记:L11-分组查询
分组查询:先对数据进行分组,然后对每一组的数据进行操作 格式:select--from--group by-- 至今为止所有的关键字的执行顺序 from-- where-- group by-- se ...
- MySQL学习笔记07【事务、用户管理和权限管理】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入
1.初识MySQL 1.1数据库的定义 数据库(DataBase,简称DB),是一个按数据结构来存储和管理数据的计算机软件系统.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制 ...
- MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)
MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...
最新文章
- ES6深拷贝与浅拷贝
- 计算机组成原理:输入输出系统
- pre使页面正确显示文本格式
- Java黑皮书课后题第10章:*10.18(大素数)编写程序找出五个大于Long.Max_VALUE的素数
- svn导出项目到myeclipse,运行报ClassNotFoundException
- c语言flip用法,C ++ STL中的bitset :: flip()
- 机器学习之微积分零基础学习
- 计算机英语ppt答辩,急求英语答辩PPT范文
- 心电图心电轴怎么计算_心电图心电轴计算表
- Cordova App 热更新 超详细教程
- 【极简spark教程】RDD编程
- 【基于C++与MFC的阴阳师辅助JIAO本】防止脱发,珍爱生命,人人有责
- Pr 入门教程了解基本校正选项
- L02 Laravel 教程 - Web 开发实战进阶 - 笔记
- 【图像处理基础】RGB的解析
- 计算机xp系统怎么录音,XP系统电脑怎么录音? - KK录像机
- JAVA之模拟注册登录幸运抽奖
- 计算机网络题简单建设校园网络,计算机网络课程设计校园网络构建方案设计和实现.doc...
- android简单记事本
- java 线程多影响内存吗_Java多线程引发的性能问题,怎么解决?