Mysql基础9-事务
一、事务简介
事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败。mysql的事务默认是自动提交的,也就是说,当执行一条DML语句,Mysql会立即隐式的提交事务
二、事务操作
2.1 查看事务提交方式
select@@autocommit;
2.2 设置事务提交方式
set @@autocommit=0;
说明:如果值为1,就是自动提交,为0就是手动提交
2.3 提交事务
commit;
2.4 回滚事务
rollback;
2.5 开启事务
start transaction 或者 begin
三、事务的四大特性
- 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发影响的独立环境下运行
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的
四、事务的并发问题
- 脏读:一个事务读到另外一个还未提交的事务中修改的数据。
- 不可重复读:一个事务读取到了另一个已经提交了事务中的修改的数据。即一个事务先后读取同一条记录,但两次读取的数据不同,第一次读取的是原始数据,第二次读取到了其他已经提交的事务中修改的数据,所以会出现两次读取到不一致的数据,这就叫不可重复读
- 幻读:一个事务在未提交之前读取不到其他任何事务对数据的修改,包括提交和未提交的事务。即一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在了,好像出现了一个幻影。
五、事务隔离级别
- read uncommitted: 脏读(会出现)、不可重复读(会出现)、幻读(会出现)
- read committed: 脏读(不会出现)、不可重读读(会出现)、幻读(会出现)
- repeatable read(mysql 默认):脏读(不会出现)、不可重读度(不会出现)、幻读(会出现)
- serializable:脏读(不会出现)、不可重复读(不会出现)、幻读(不会出现)
5.1 查看事务的隔离级别
select @@transaction_isolation;
5.2 设置事务隔离级别
set [session|global] transaction isolation level {read uncimmitted | read committed | repeatable read | serializable};
说明1:session :设置仅对当前对话起作用
说明2:global :设置对全局都有用
六、事务的演示
6.1 案例使用的accout表结构及数据
mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 2000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 rows in set (0.00 sec)
6.2 案例1:
需求1:模拟转账业务创建一个account表,里面有张三、李四两个人,初始金额都有两千元,现在需求让张三转账1000元给李四
第一步:张三的账户余额减1000
mysql> update account set money = money - 1000 where name="张三";
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
查询张三、李四的账户余额,验证现在余额的变化
mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 rows in set (0.00 sec)
说明:此时张三的账户已经减去1000了,但是李四的账户还没有增加1000
第二步:李四的账户余额加1000
mysql> update account set money = money + 1000 where name="李四";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
查询张三、李四的账户余额,验证现在余额的变化
mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 3000 |
+----+--------+-------+
2 rows in set (0.00 sec)
说明:这个时候李四的账户上也已经增加了1000元,所以这个转账分为了两步实现。
6.3 案例2
异常案例展示:异常说明,如果这个时候在执行完第一步,张三的账户已经减少了1000元,但是系统出问题了,李四的账户上并没有增加1000,这样就出现了异常。
在进行异常展示之前,先把数据恢复成各自2000的余额
mysql> update account set money=2000;
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2 Changed: 2 Warnings: 0 mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 2000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 rows in set (0.00 sec)
执行异常语句

再来查询张三和李四的余额
mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 1000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 rows in set (0.00 sec)
说明:这时候张三的余额已经减去1000,但是李四的账户上却没有增加1000,这在显示中是绝对不允许的。
6.4 案例3
使用事务完成,首先同样也是先还原数据,每个人的余额都是2000元
mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 2000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 rows in set (0.02 sec)
执行事务

在验证这时张三和李四的余额
mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 2000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 rows in set (0.00 sec)
说明1:在使用了事务后,会保证事务的原子性,即该事务内的语句要成功够成功,要失败在全部返回,不会存在部分sql执行成功的情况
七、脏读的案例

说明1:首先将模拟客户端改为read uncommitted 模式
说明2:客户端1和客户端2同时开启一个事务
说明3:在客户端2中修改account表中数据,但并不提交事务
说明4:在客户端1中读到了客户端2未提交的事务数据,即read uncommitted 模式下会出现脏读。

八、不可重复读的案例

说明1:在read committed的隔离模式下
说明2:客户端1和客户端2,同时开启一个事务
说明3:客户端2修改张三余额数据,客户端1未查询到客户端2未提交的修改,因为查询到就是脏读了
说明4:客户端2提交修改余额的事务,客户端1查询,此时查询到张三的余额数据已经修改,及在一个事务中可以查询到其他已经提交事务对数据的修改,而导致在一次事务中对不同数据查询到的值不一致这就是不可重复读。
说明5:在一个事务中查询到其他未提交的事务修改的数据叫脏读,查询到其他已经提交的事务修改的数据叫不可重复读
九、幻读的案例

说明1:多个事务并发时,一个事务新增了数据,并提交,在另外一个事务中查询不到,但是却也不能新增同样的数据,这就是幻读
Mysql基础9-事务的更多相关文章
- MySQL基础之事务编程学习笔记
MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...
- Mysql基础之 事务
MySql事务 Mysql事务主要处理操作量大,复杂度高的数据. Mysql事务需要注意的三点: 1.在mysql中只有使用innodb数据库引擎的数据库或表才支持事务 2.事务处理可以用来维护数据库 ...
- mysql基础_事务
定义 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 例如:王五向赵六的账户上转 ...
- 重新整理 mysql 基础篇————— 事务隔离级别[四]
前言 简单介绍一下事务隔离的基本 正文 Read Uncommitted(未提交读) 这个就是读未提交.就是说在事务未提交的时候,其他事务也可以读取到未提交的数据. 这里举一个例子,还是前一篇的例子. ...
- MySQL中Procedure事务编写基础笔记
原文:MySQL中Procedure事务编写基础笔记 目录: 一.PROCEDURE: 二.CREATE PROCEDURE基本语法: 三.PROCEDURE小进阶 3.1.基本的DECLARE语 ...
- MySQL基础篇(06):事务管理,锁机制案例详解
本文源码:GitHub·点这里 || GitEE·点这里 一.锁概念简介 1.基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题.锁机制是一个非常大的模块,贯彻MyS ...
- mysql基础 事务的认识和使用
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务是恢复和并发控制的基本单位. 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序 ...
- 《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识
1.2 并发控制 1.2.1 读写锁 在处理并发读或写时,通过实现一个由两种类型的锁组成的锁系统来解决问题.这两种类型的锁通常被称为 共享锁(shared lock) 和 排它锁(exclusive ...
- mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制
事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元 ...
- Mysql基础代码(不断完善中)
Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...
随机推荐
- Python分割多空格字符方法
问题: 现有一个字符串 "1 + 5" ,想要获取 1,+,5 这三个元素 做法: str.split(' ') ['1', '', '', '', '', '', '+', '' ...
- Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题
Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数.各版本差异.官方提供常见问题 1.Midjourney Prompt 高级参数 Quality ...
- git push origin master 提示输入用户名和密码
今天更换了一台电脑,重新配置了SSH keys:但是在push得时候提示我输入用户名和密码 taodeMacBook-Pro:my_trip_proj tao$ git push origin mas ...
- ubuntu18 安装单机k8s v1.18.2
背景 当我们需要对k8s进行二次开发时,k8s环境是必须的,那么在ubuntu上部署单机k8s是最方便的,便于开发调试 系统准备 本人用的是Ubuntu18,以下以此为例 部署之前,最好切换至root ...
- WPF 入门笔记 - 02 - 布局综合应用
本篇博文对接上篇末尾处WPF常用布局控件的综合应用,为痕迹g布局控件介绍课后作业的一个思路方法. 前言 首先来谈一谈布局原则: WPF窗口只能包含一个元素(Window元素属于内容控件,内容控件只允许 ...
- odoo开发教程九:Odoo10 API
一:纪录集API model中的数据是以集合的形式使用的,因此可以使用集合运算来操作. 集合运算符 record in set返回record是否在set中,record须为单条记录,record n ...
- App性能测试之SoloPi
SoloPi简介 SoloPi是蚂蚁金服开发的一款无线化.非侵入.免Root的Android专项测试工具.直接操控安卓系统的手机或智能设备,即可完成自动化的功能.性能.兼容性.以及稳定性测试等工作,降 ...
- 园子的商业化努力-行行AI人才培养「常青藤计划」
各位园子的小伙伴: 感谢大家长期对园子的支持,AI大模型出现之后,各行各业都在积极思考如何应对,如何把业务场景和AI结合.在这个过程中,AI人才缺乏是最核心的问题. 基于此,园子打算在AI人才培养方面 ...
- CF1810G The Maximum Prefix
经典套路. 题意 你将随机生成一个长度为 \(k\) 的数组 \(a\),其中 \(a_i\) 有 \(p_i\) 概率为 \(1\),否则为 \(-1\).定义其前缀和数组 \(s_i = \sum ...
- 人工智能智能城市(AIinSmartCities)领域的100篇热门博客文章标题如下:
目录 人工智能智能城市(AI in Smart Cities)领域的100篇热门博客文章标题如下: 1.<智能城市与大数据:未来城市大脑的发展方向> 2.<智能交通系统的设计与实现& ...