一、事务简介

  事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失败。mysql的事务默认是自动提交的,也就是说,当执行一条DML语句,Mysql会立即隐式的提交事务

二、事务操作

  2.1 查看事务提交方式   

  1. select@@autocommit;

  2.2 设置事务提交方式

  1.  set @@autocommit=0;

    说明:如果值为1,就是自动提交,为0就是手动提交

  2.3 提交事务 

  1. commit;

  2.4 回滚事务   

  1. rollback;

  2.5 开启事务  

  1. start transaction 或者 begin

三、事务的四大特性

  • 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发影响的独立环境下运行
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

四、事务的并发问题

  • 脏读:一个事务读到另外一个还未提交的事务中修改的数据。
  • 不可重复读:一个事务读取到了另一个已经提交了事务中的修改的数据。即一个事务先后读取同一条记录,但两次读取的数据不同,第一次读取的是原始数据,第二次读取到了其他已经提交的事务中修改的数据,所以会出现两次读取到不一致的数据,这就叫不可重复读
  • 幻读:一个事务在未提交之前读取不到其他任何事务对数据的修改,包括提交和未提交的事务。即一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在了,好像出现了一个幻影。

五、事务隔离级别

  • read uncommitted: 脏读(会出现)、不可重复读(会出现)、幻读(会出现)
  • read committed:    脏读(不会出现)、不可重读读(会出现)、幻读(会出现)
  • repeatable read(mysql 默认):脏读(不会出现)、不可重读度(不会出现)、幻读(会出现)
  • serializable:脏读(不会出现)、不可重复读(不会出现)、幻读(不会出现)

  

  5.1 查看事务的隔离级别

  1. select @@transaction_isolation;

  5.2 设置事务隔离级别

  1. set [session|global] transaction isolation level {read uncimmitted | read committed | repeatable read | serializable};

  说明1:session :设置仅对当前对话起作用

  说明2:global :设置对全局都有用

六、事务的演示

  6.1 案例使用的accout表结构及数据

  1. mysql> select * from account;
  2. +----+--------+-------+
  3. | id | name | money |
  4. +----+--------+-------+
  5. | 1 | 张三 | 2000 |
  6. | 2 | 李四 | 2000 |
  7. +----+--------+-------+
  8. 2 rows in set (0.00 sec)

  6.2 案例1:

    需求1:模拟转账业务创建一个account表,里面有张三、李四两个人,初始金额都有两千元,现在需求让张三转账1000元给李四

    第一步:张三的账户余额减1000

  1. mysql> update account set money = money - 1000 where name="张三";
  2. Query OK, 1 row affected (0.01 sec)
  3. Rows matched: 1 Changed: 1 Warnings: 0

    查询张三、李四的账户余额,验证现在余额的变化

  1. mysql> select * from account;
  2. +----+--------+-------+
  3. | id | name | money |
  4. +----+--------+-------+
  5. | 1 | 张三 | 1000 |
  6. | 2 | 李四 | 2000 |
  7. +----+--------+-------+
  8. 2 rows in set (0.00 sec)

    说明:此时张三的账户已经减去1000了,但是李四的账户还没有增加1000

    第二步:李四的账户余额加1000

  1. mysql> update account set money = money + 1000 where name="李四";
  2. Query OK, 1 row affected (0.00 sec)
  3. Rows matched: 1 Changed: 1 Warnings: 0

    查询张三、李四的账户余额,验证现在余额的变化

  1. mysql> select * from account;
  2. +----+--------+-------+
  3. | id | name | money |
  4. +----+--------+-------+
  5. | 1 | 张三 | 1000 |
  6. | 2 | 李四 | 3000 |
  7. +----+--------+-------+
  8. 2 rows in set (0.00 sec)

    说明:这个时候李四的账户上也已经增加了1000元,所以这个转账分为了两步实现。

  6.3 案例2

    异常案例展示:异常说明,如果这个时候在执行完第一步,张三的账户已经减少了1000元,但是系统出问题了,李四的账户上并没有增加1000,这样就出现了异常。

    在进行异常展示之前,先把数据恢复成各自2000的余额

  1. mysql> update account set money=2000;
  2. Query OK, 2 rows affected (0.02 sec)
  3. Rows matched: 2 Changed: 2 Warnings: 0
  4.  
  5. mysql> select * from account;
  6. +----+--------+-------+
  7. | id | name | money |
  8. +----+--------+-------+
  9. | 1 | 张三 | 2000 |
  10. | 2 | 李四 | 2000 |
  11. +----+--------+-------+
  12. 2 rows in set (0.00 sec)

    执行异常语句

    

    再来查询张三和李四的余额

  1. mysql> select * from account;
  2. +----+--------+-------+
  3. | id | name | money |
  4. +----+--------+-------+
  5. | 1 | 张三 | 1000 |
  6. | 2 | 李四 | 2000 |
  7. +----+--------+-------+
  8. 2 rows in set (0.00 sec)

    说明:这时候张三的余额已经减去1000,但是李四的账户上却没有增加1000,这在显示中是绝对不允许的。

  6.4 案例3

    使用事务完成,首先同样也是先还原数据,每个人的余额都是2000元

  1. mysql> select * from account;
  2. +----+--------+-------+
  3. | id | name | money |
  4. +----+--------+-------+
  5. | 1 | 张三 | 2000 |
  6. | 2 | 李四 | 2000 |
  7. +----+--------+-------+
  8. 2 rows in set (0.02 sec)

    执行事务

    

    在验证这时张三和李四的余额

  1. mysql> select * from account;
  2. +----+--------+-------+
  3. | id | name | money |
  4. +----+--------+-------+
  5. | 1 | 张三 | 2000 |
  6. | 2 | 李四 | 2000 |
  7. +----+--------+-------+
  8. 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. pycharm eslint 关闭

    pycharm 关闭eslint 文件->设置->语言和框架->JavaScript->代码质量工具->ESLint

  2. Java方法的调用以及方法参数传递、方法的递归调用

    一.方法的调用以及方法参数传递 1.方法的定义: ​ 访问修饰符 返回值类型 方法名 ([参数列表]){ ​ 方法体 } 如果方法体中需要一些未知的数据作为执行条件,那么这些数据可以作为参数. 如果方 ...

  3. Java 新的生态,Solon v2.3.2 发布

    Solon 是什么框架? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费资源. 解决痛点? ...

  4. 自然语言处理 Paddle NLP - 预训练语言模型及应用

    什么是语言理解? 关于疫情的一段对话: 中国:我们这边快完了 欧洲:我们这边快完了 中国:我们好多了 欧洲:我们好多了 挑战: 语言的复杂性和多样性 多义/同义/歧义现象 灵活多变的表达形式 语言背后 ...

  5. 一分钟学一个 Linux 命令 - ps

    前言 大家好,我是 god23bin.欢迎来到<一分钟学一个 Linux 命令>系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天要说的是 ps 命令. 什么是 ps 命令? ...

  6. uniapp企业微信web-view父子通信问题

    项目背景:开发工具为HBuilderX,框架为uniapp,开发移动端的Web应用,在企业微信中使用(自建应用),Web开发的应用,不是小程序. 需求:页面中用到<web-view>组件, ...

  7. python打包exe总结 pyinstaller py2exe

    Python打包exe 有很多可以用的 如 pyinstaller py2exe cx_Freeze nuitka py2app py0xidizer 其中cx_Freeze没用过 nuitka是把p ...

  8. Linux 一些常用命令

    Linux命令的分类 1.帮助命令(help) 2.常用系统工作命令 3.常用状态检测命令 4.工作目录切换命令 linux命令在线中文手册 Linux常用命令 echo命令 作用:在终端输出字符串或 ...

  9. .NET写一个自己的Lambda表达式与表达式树

    LambdaExpression继承Expression Expression又继承LambdaExpressio 所以,Expression与 Expression的区别在于:泛型类以静态类型的方法 ...

  10. 通信原理知识点总结(XDU网信通原)

    因为感觉第2章和第7章内容特别乱,当时老师讲的时候好像也没有按照一个正确的顺序来讲,所以我就把这两部分的内容按照结构顺序整理了一下,这样更便于理解和记忆 第2章 无线信道传输特性 显示不全点链接看完整 ...