先看个小案例:

  • 话不多说,上案例,先创建一个表
mysql> CREATE TABLE IF NOT EXISTS `account`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(), `balance` INT() DEFAULT NULL, PRIMARY KEY (id))ENGINE=innodb charset=utf8mb4;
  • 插入几条数据
mysql> insert into account(name,balance) values('lilei',);
Query OK, row affected (0.00 sec) mysql> insert into account(name,balance) values('hanmei',);
Query OK, row affected (0.00 sec) mysql> insert into account(name,balance) values('lucy',);
Query OK, row affected (0.00 sec)
  • 此时可以看到三条数据:
mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| | lilei | |
| | hanmei | |
| | lucy | |
+----+--------+---------+
rows in set (0.00 sec)
  • 我们开启两个命令行界面,然后实践一下

1》我们先在一个命令行(下面称为命令行A)中,执行一段事务操作,但是不提交

mysql> begin;
Query OK, rows affected (0.00 sec) mysql> update account set balance= where id=;
Query OK, row affected (0.07 sec)
Rows matched: Changed: Warnings: mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| | lilei | |
| | hanmei | |
| | lucy | |
+----+--------+---------+
rows in set (0.00 sec)

2》然后在另一个命令行(下面称为命令行B)中,进行一次修改操作:

mysql> update account set balance= where id =;

3》可以看到在命令行B中,并不会看到修改结构,因为命令行A中的事务会默认加上一个行锁,只要事务不停,行锁就一直保留:

4》此时我们在命令行A中进行提交,在命令行B中会看到提交返回:

5》但是命令行A提交了事务后,因为A本想将ID为3的用户【balance】修改为3000,可此时查看结果后发现:

6》所以此时A对ID为3的用户的修改未达到理想值

  • 此处引申一点,由于MySQL的默认隔离级别是行锁,如何验证它是行锁呢:
  • 我们在A中修改【ID=3】的数据,然后在B中修改【ID=2】的数据,可以明显看到有结果返回,由此可以证明,锁仅仅是加在行上的

此时我们言归正传:

  • 事务与ACID属性:
原子性(Atomicity)、一致性(Consistent)、隔离性(Isolation)、持久性(Durable)
  • 并发事务处理带来的问题:
》更新丢失:两个事务同事操作相同数据,后提交的事务会覆盖先提交的事务处理结果,通过乐观锁就可以解决。(即文章开篇介绍的案例)

》脏读:事务A读取到了事务B已经修改,但尚未提交的数据,如果事务B回滚,A读取的数据无效,不符合一致性。

》不可重读:事务A读取到了事务B已经提交的修改数据,不符合隔离性。

》幻读:事务A读取到了事务B提交的新增数据,不符合隔离性。
  • 事务隔离级别:
    • 常看数据库事务隔离级别:
mysql> show variables like 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
    • 设置事务隔离级别:
mysql> set tx_isolation='REPEATABLE-READ';(其他三种:READ-UNCOMMITTED,READ-COMMITTED,SERIALIZABLE)

  • 此时我们分别聊聊剩下的案例,为了方便验证,我们先把隔离级别设置到最低级:
mysql> set tx_isolation ='READ-UNCOMMITTED';

1》脏读,不废话,直接上实例:

分析一下,上述指令,我们按顺序执行,可以看出因为事务B(右面)最后进行了回滚操作,但是事务A(左面)两次执行结果并不一样,造成了脏读情况。

2》不可重读,也不废话,线上案例:

分析来看,上述指令情况使得原子的一致性隔离性均未实现,因为事务A还没有结束,所以两次所读数据应该一致,才可以保证事务实现一致性和隔离性。

3》幻读,先不墨迹,看案例就完了:

事务A一直处在一个事务内,但事务B缺新增了数据并提交了,而事务A两次查询结果不一致,从而该情况叫幻读。

  • 数据库默认隔离级别是【可重复度】,但是并没有解决【幻读】情况,请问为什么不使用【可串行化】呢?

因为【可串行化】的性能非常低,如果一个商城,开了【可串行化】的级别后,下个订单却要一分钟,这种用户体验你会接受么^ - ^

【MySQL】深入理解MySQL锁和事务隔离级别的更多相关文章

  1. 面试必问的MySQL锁与事务隔离级别

    之前多篇文章从mysql的底层结构分析.sql语句的分析器以及sql从优化底层分析, 还有工作中常用的sql优化小知识点.面试各大互联网公司必问的mysql锁和事务隔离级别,这篇文章给你打神助攻,一飞 ...

  2. (转)SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

    五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...

  3. SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

    五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...

  4. 深入理解mysql锁与事务隔离级别

    一.锁 1.锁的定义     锁即是一种用来协调多线程或进程并发使用同一共享资源的机制 2.锁的分类 从性能上分类:乐观锁和悲观锁 从数据库操作类型上分类:读锁和写锁 从操作粒度上分类:表锁和行锁 2 ...

  5. MySql锁和事务隔离级别

    在讲mysql事物隔离级别之前,我们先简单说说mysql的锁和事务. 一:数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去 ...

  6. Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题

    mysql读锁,写锁,乐观锁 读锁,也叫共享锁(shared lock) SELECT * FROM table_name  WHERE ...  LOCK IN SHARE MODE 写锁,也叫排他 ...

  7. MySQL锁与事务隔离级别

    一.概述 1.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.IO等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并发访 ...

  8. oracle,mysql,sql server三大数据库的事务隔离级别查看方法

    1:mysql的事务隔离级别查看方法 mysql 最简单,执行这条语句就行:select @@tx_isolation  详情: 1.查看当前会话隔离级别 select @@tx_isolation; ...

  9. SQL Server中锁与事务隔离级别

    SQL Server中的锁分为两类: 共享锁 排它锁 锁的兼容性:事务间锁的相互影响称为锁的兼容性. 锁模式 是否可以持有排它锁 是否可以持有共享锁 已持有排它锁 否 否 已持有共享锁 否 是 SQL ...

随机推荐

  1. 【集群实战】NFS网络文件共享服务3-相关知识补充(showmount,exports,rpc)

    1. showmount命令说明 showmount命令一般用于从NFS客户端检查NFS服务器端共享目录的情况. 参数说明: -e,--exports 显示NFS服务器输出的目录列表 [root@we ...

  2. 02-线性结构3 Reversing Linked List

    02-线性结构3 Reversing Linked List   (25分) 时间限制:400ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 http ...

  3. python基础1习题练习

    python基础1习题练习: #encoding:utf-8 #1.实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败! name=input('na ...

  4. 2019 ICPC 银川网络赛 D. Take Your Seat (疯子坐飞机问题)

    Duha decided to have a trip to Singapore by plane. The airplane had nn seats numbered from 11 to nn, ...

  5. codeforce 272B Dima and Sequence

    B. Dima and Sequence Dima got into number sequences. Now he's got sequence a1, a2, ..., an, consisti ...

  6. docker批量删除本地镜像和容器

    长时间运行docker,每次只用docker kill去停止容器,但是从没删除过本地镜像,导致有上百个镜像在占用内存. 1.批量停止容器 docker container stop $(docker ...

  7. 设计模式(Java语言)- 原型模式

    原型模式(Prototype Pattern)也有人将原型模式称为克隆模式,是属于创造型设计模式,用于创建重复的对象,提供了一种创建对象的最佳方式.原型模式需要实现Cloneable接口,来实现对象的 ...

  8. windows脱密码总结

    方式1:通过SAM数据库获得本地用户HASH sam文件:是用来存储本地用户账号密码的文件的数据库system文件:里面有对sam文件进行加密和加密的密钥 利用方式: 导出sam和system: re ...

  9. SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...

  10. 在培训机构花了好几万学Java,当了程序员还常被鄙视,这是招谁惹谁了?

    在之前的文章中说过,我是非计算机专业,通过参加培训进入程序员这行的. 入了程序员这行后,挺长一段时间在亲戚朋友中,我还是挺有面子的:家族里的第一个程序员,工作不用风吹日晒,收入比其他行业高不少,尤其是 ...