一、事务简介

  事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败。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-事务的更多相关文章

  1. MySQL基础之事务编程学习笔记

    MySQL基础之事务编程学习笔记 在学习<MySQL技术内幕:SQL编程>一书,并做了笔记.本博客内容是自己学了<MySQL技术内幕:SQL编程>事务编程一章之后,根据自己的理 ...

  2. Mysql基础之 事务

    MySql事务 Mysql事务主要处理操作量大,复杂度高的数据. Mysql事务需要注意的三点: 1.在mysql中只有使用innodb数据库引擎的数据库或表才支持事务 2.事务处理可以用来维护数据库 ...

  3. mysql基础_事务

    定义 一个事务其实就是一个完整的业务逻辑,是一个最小的工作单元,不可再分,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败. 例如:王五向赵六的账户上转 ...

  4. 重新整理 mysql 基础篇————— 事务隔离级别[四]

    前言 简单介绍一下事务隔离的基本 正文 Read Uncommitted(未提交读) 这个就是读未提交.就是说在事务未提交的时候,其他事务也可以读取到未提交的数据. 这里举一个例子,还是前一篇的例子. ...

  5. MySQL中Procedure事务编写基础笔记

    原文:MySQL中Procedure事务编写基础笔记 目录: 一.PROCEDURE: 二.CREATE PROCEDURE基本语法: 三.PROCEDURE小进阶   3.1.基本的DECLARE语 ...

  6. MySQL基础篇(06):事务管理,锁机制案例详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.锁概念简介 1.基础描述 锁机制核心功能是用来协调多个会话中多线程并发访问相同资源时,资源的占用问题.锁机制是一个非常大的模块,贯彻MyS ...

  7. mysql基础 事务的认识和使用

    事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务是恢复和并发控制的基本单位. 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序 ...

  8. 《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识

    1.2 并发控制 1.2.1 读写锁 在处理并发读或写时,通过实现一个由两种类型的锁组成的锁系统来解决问题.这两种类型的锁通常被称为 共享锁(shared lock) 和 排它锁(exclusive ...

  9. mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制

    事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元 ...

  10. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

随机推荐

  1. 【HDU】1559 最大子矩阵 (二维前缀和,动态规划)

    动态规划之二维前缀和 题目 给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大. 输入 输入数据的第一行为一个正整数T,表示有T组测试数据.每一组测试数据的第一行为四个正 ...

  2. 金三银四抢人季,HR 如何 3 招做到效率为王?

    春招伊始,面对队伍庞大的校招人群,蜂拥而入的简历,HR 如何才能快速搞定呢?Bug君总结了一下过往招聘季的一些比较流行的环节: 通过线上宣讲,节省出行成本.时间,老板更认可了 现在大多数企业都会在直播 ...

  3. 常用类API

    常用类 API CalendarCalendar 线程不安全 ,不同步获得并设置日历字段值 Calendar 使用两个参数定义了特定于语言环境的 7 天制星期:星期的第一天和第一个星期中的最小一天(从 ...

  4. awk 内置变量与自定义变量

    点击上方" 生信科技爱好者 ",马上关注 真爱,请置顶或星标 作者:ghostwu 原文:https://www.cnblogs.com/ghostwu/p/9085653.htm ...

  5. 小技巧 | 使用 mv 重命名文件无需两次键入文件名称

    使用过 Bash 的童鞋都知道 mv 是一个可以用于文件改名的命令,而且使用这个命令修改文件名时我们需要输入两次文件名(旧名字和新名字). 如果有一种情况是只需要你改动文件名中的一个字母,而文件名又特 ...

  6. 深入探究for...range语句

    1. 引言 在Go语言中,我们经常需要对数据集合进行遍历操作.对于数组来说,使用for语句可以很方便地完成遍历.然而,当我们面对其他数据类型,如map.string 和 channel 时,使用普通的 ...

  7. ESP8266-01S烧录固件

    ESP8266-01S 整理了一下ESP01S的烧录固件和烧录APP 链接:https://pan.baidu.com/s/1DApOQcWhqvk378ZklJSypA 提取码:1028 文件夹包含 ...

  8. [ESP] 私有版Rainmaker User Mapping

    [ESP] 私有版Rainmaker User Mapping 1. 设备烧录的程序esp-rainmaker/examples/gpio这个demo 我这里是自己的工程,可以参照 idf.py se ...

  9. ASIC加速技术在ASIC加速性能优化中的新应用与挑战

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 5. 优化与改进 1. 引言 随着计算机技术的发展,芯片的性能和面积都得到了极大的提升.为了进一步提高芯片的 ...

  10. Python随机数据生成——Faker的使用

    安装Faker pip install faker 导入模块及基本配置 # 导入Faker from faker import Faker # 初始化,设置locale为中文:默认是英文 fake = ...