目录

一、事务概述

二、和事务有关的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-事务相关推荐

  1. 【Mysql学习日记2——修改】

    系列文章目录 [Mysql学习日记1--排序与修改] 文章目录 系列文章目录 前言 一.修改表的名字(修改) 1.题目要求 2.解题思路 3.代码示例 二.按日期分组销售(查询:非重复计量) 1.题目 ...

  2. 【MySQL】mysql学习笔记04 事务

    – =事务============ – 事务原则:ASID原则 – 原子性 – 一致性 – 隔离性 – 持久性 – mysql是自动开启事务提交的 1.建表 CREATE DATABASE shop ...

  3. Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

    文章目录 1.事务概述 2.事务特性 3.事务隔离级别 4.演示事务 4.1.演示读未提交 4.2.演示读已提交 4.3.演示可重复读 4.4.演示串行化读 1.事务概述 什么是事务? 一个事务是一个 ...

  4. mysql开始全部日记,MySQL学习日记—节选SQLZOO习题(1)

    前言 最近的开发任务是要从零开始搭建一个网站,刚开始是准备做一个纯前端页面,但是出于后期维护和拓展的考虑,最后还是准备使用MVC框架来搭建,那么开发的第一步就是要建立数据库了,因此这段时间也在学习My ...

  5. MYSQL学习日记(三)

    1. 多表关联查询 1. 内连接 标准语法: select * from 表1 inner join 表2 on 关联条件; 两个表中所有符合关联条件的两条数据,就拼接成一个数据,作为本次查询的一条结 ...

  6. Mysql学习日记:L11-分组查询

    分组查询:先对数据进行分组,然后对每一组的数据进行操作 格式:select--from--group by-- 至今为止所有的关键字的执行顺序 from-- where-- group by-- se ...

  7. MySQL学习笔记07【事务、用户管理和权限管理】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  8. mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入

    1.初识MySQL 1.1数据库的定义 数据库(DataBase,简称DB),是一个按数据结构来存储和管理数据的计算机软件系统.每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制 ...

  9. MySQL学习思维导图(MySQL简介、SQL基础命令、约束、单表查询、多表查询、内置函数、存储过程、视图、事务、索引)

    MySQL学习思维导图 内容包括:MySQL简介.SQL基础命令.约束.单表查询.多表查询.内置函数.存储过程.视图.事务.索引 文章目录 MySQL学习思维导图 一.MySQL简介 二.SQL基础命 ...

最新文章

  1. 上海 |《PMCAFF 产品经理第一课》全面提升,微博副总裁、丁香园、1号店、淘宝、阿里巴巴产品总监最强分享...
  2. C#学习小结(DAY1)
  3. Paint.NET 3.0正式版发布了
  4. mybatis的二级缓存
  5. 根据窗口名称查找关键字弹性域用到的表,列等信息
  6. Windows 命令终端(CMD)的快捷键
  7. 转一篇关于并发和并行概念的好文,附带大神评论
  8. 【Java面试题】19 final,finally和finalize的区别
  9. Tomcat主页404错误
  10. Navicat 用ssh通道连接时总是报错 (报错信息:SSH:expected key exchange group packet form serve...
  11. Mysql 索引(学习笔记十二)
  12. 领导想提拔别人,让我让位置,我该怎么办?
  13. 微信页面设计 小总结
  14. [基于子串搜索的方法] BNDM算法
  15. 31 GroupSock(AddressString)——live555源码阅读(四)网络
  16. live2d手机制作软件_Live2d( 动画制作软件 )中文版分享
  17. 卸载网易邮箱大师邮件从服务器删除,如何卸载网易邮箱大师 网易邮箱大师卸载教程...
  18. 关于Lua的下载以及wlua、luac等文件的解释
  19. MES系统供应商评估报告-- Gartner出品
  20. 植发搞笑图片_搞笑:终于找到原图了!像不像?

热门文章

  1. iMX51的键盘布局文件
  2. 每日一题,每日一练。11车的可用捕获量(半夜两点在棋盘上左右横跳),
  3. 怎么把avi转换成mov格式,5种方案小白都能学会
  4. matlab运行mex文件出错“mtimesx.mexw64无效: 缺少依赖共享库VCOMP100.DLL”
  5. python神经网络编程 豆瓣,小波神经网络预测python
  6. 遇到了,要懂得珍惜..
  7. 工业经济逐渐复苏,PLC工程师又要开始出差了?
  8. pca人脸识别python_PCA人脸识别技术概述
  9. gorm FirstOrCreate和受影响行数
  10. 拼多多想制作出优质的主图?需了解这六点!